从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 tableOperand type clash: text is incompatible with float
- 去掉方括号时执行:
报错:SELECT Order, Benämning, Antal FROM tableIncorrect syntax near '�'.
只有查询不含åäö或空格的列时,PDO才能正常工作。另外还犯了个错误:为了设置UTF-8,在PDO连接里添加了MySQL专属的PDO::MYSQL_ATTR_INIT_COMMAND配置,但实际连接的是SQL Server。
问题根源
- 驱动不兼容:一开始使用的是ODBC版PDO驱动,对SQL Server中带åäö这类特殊字符的列名,编码解析存在兼容问题。
- 配置误用:
PDO::MYSQL_ATTR_INIT_COMMAND是MySQL独有的初始化命令,对SQL Server完全无效,无法正确设置UTF-8编码,导致列名里的特殊字符被解析乱码,进而触发语法或类型错误。
解决步骤
改用PDO_SQLSRV驱动(SQL Server官方提供的PDO驱动):
- 确认PHP环境已安装对应版本的PDO_SQLSRV扩展(根据PHP版本和SQL Server版本选择适配的扩展包)。
- 使用正确的连接字符串初始化PDO,直接在DSN中指定UTF-8编码:
$dsn = "sqlsrv:Server=你的服务器地址;Database=你的数据库名;CharacterSet=UTF-8"; $pdo = new PDO($dsn, "用户名", "密码"); - 删除之前添加的
PDO::MYSQL_ATTR_INIT_COMMAND配置项,该配置对SQL Server无效。
验证结果
切换为PDO_SQLSRV驱动后,无论列名是否带方括号,含åäö字符的列都能正常查询,之前的报错全部消失。
内容的提问来源于stack exchange,提问作者Björn C
相关产品推荐
相关产品推荐

