使用ODBC连接SQL Server与PHP时重音字符获取异常问题
我之前在做PHP对接SQL Server项目时,也碰到过重音字符读取异常的坑!大概率是字符编码不匹配导致的,给你几个亲测有效的解决办法:
在连接字符串中明确指定字符编码
你的原始连接字符串没有设置编码参数,SQL Server默认的编码可能和PHP常用的UTF-8不兼容,直接导致重音字符(比如é、ñ、à这类)显示异常。可以尝试添加CHARSET=UTF-8或者CODEPAGE=65001(65001是UTF-8对应的Windows代码页)参数,修改后的连接字符串示例:// 方式1:使用CHARSET参数 $connection_string = "DRIVER={SQL Server};SERVER=$server;PORT=$port;DATABASE=$database;CHARSET=UTF-8;"; // 方式2:使用CODEPAGE参数(兼容旧版ODBC驱动) $connection_string = "DRIVER={SQL Server};SERVER=$server;PORT=$port;DATABASE=$database;CODEPAGE=65001;";检查并修正SQL Server的字符集配置
先确认你的数据库、目标表以及字段的collation(排序规则)是否支持重音字符。推荐使用支持UTF-8的排序规则,比如SQL Server 2019及以上版本的UTF8_GENERAL_CI,或者兼容旧版本的SQL_Latin1_General_CP1_CI_AS(该规则支持重音区分)。如果字段的排序规则本身不支持重音,就算连接字符串设置了编码,读取结果还是会出问题。连接成功后强制设置会话字符编码
在ODBC连接建立成功后,执行一条SQL语句来强制指定当前连接的字符编码,确保SQL Server返回的结果以UTF-8格式传输:$conn = odbc_connect($connection_string, $username, $password); if ($conn) { // 针对SQL Server的会话编码设置 odbc_exec($conn, "SET NAMES 'UTF8'"); // 或者另一种写法 // odbc_exec($conn, "SET CHARSET UTF8"); }升级到新版ODBC驱动
如果你还在使用老旧的{SQL Server}驱动,建议换成微软官方的{ODBC Driver 17 for SQL Server}或更新版本,新版驱动对UTF-8的支持更完善,重音字符的处理稳定性更高。更换后的连接字符串示例:$connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=$server,$port;DATABASE=$database;CHARSET=UTF-8;";注意这里的SERVER参数格式是
服务器名,端口号,不需要单独拆分PORT参数。
内容的提问来源于stack exchange,提问作者xfolder

