You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从sqlsrv_connect转PDO后,含åäö字符的SQL查询异常求助

PDO连接SQL Server时含åäö字符的列查询报错解决办法

问题情况

原先用sqlsrv_connect连接SQL Server,执行下面的SQL完全正常:

SELECT Order, [Benämning], [Vår ref] FROM table

换成PDO之后,查询带åäö字符的列就出现报错:

  • 保留方括号时执行:
    SELECT Order, [Benämning], Antal FROM table
    
    报错:

    Operand type clash: text is incompatible with float

  • 去掉方括号时执行:
    SELECT Order, Benämning, Antal FROM table
    
    报错:

    Incorrect syntax near '�'.
    只有查询不含åäö或空格的列时,PDO才能正常工作。另外还犯了个错误:为了设置UTF-8,在PDO连接里添加了MySQL专属的PDO::MYSQL_ATTR_INIT_COMMAND配置,但实际连接的是SQL Server。

问题根源

  1. 驱动不兼容:一开始使用的是ODBC版PDO驱动,对SQL Server中带åäö这类特殊字符的列名,编码解析存在兼容问题。
  2. 配置误用:PDO::MYSQL_ATTR_INIT_COMMAND是MySQL独有的初始化命令,对SQL Server完全无效,无法正确设置UTF-8编码,导致列名里的特殊字符被解析乱码,进而触发语法或类型错误。

解决步骤

改用PDO_SQLSRV驱动(SQL Server官方提供的PDO驱动):

  1. 确认PHP环境已安装对应版本的PDO_SQLSRV扩展(根据PHP版本和SQL Server版本选择适配的扩展包)。
  2. 使用正确的连接字符串初始化PDO,直接在DSN中指定UTF-8编码:
    $dsn = "sqlsrv:Server=你的服务器地址;Database=你的数据库名;CharacterSet=UTF-8";
    $pdo = new PDO($dsn, "用户名", "密码");
    
  3. 删除之前添加的PDO::MYSQL_ATTR_INIT_COMMAND配置项,该配置对SQL Server无效。

验证结果

切换为PDO_SQLSRV驱动后,无论列名是否带方括号,含åäö字符的列都能正常查询,之前的报错全部消失。

内容的提问来源于stack exchange,提问作者Björn C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:45:52