如何在PDO_SQLSRV中设置Windows-1250(中欧)编码?
解决pdo_sqlsrv直接获取Windows-1250编码数据的问题
pdo_sqlsrv确实没有提供直接指定Windows-1250编码的常量选项,不过有两种可行的方法实现你的需求:
方法1:使用二进制编码模式获取原始数据
设置连接属性为PDO::SQLSRV_ENCODING_BINARY后,驱动会跳过自动编码转换,直接返回数据库中存储的原始字节。如果你的SQL Server数据本身是Windows-1250编码存储的,查询结果就是原生的Windows-1250字符串,无需额外处理:
$pdo = new PDO("sqlsrv:Server=你的服务器地址;Database=你的数据库名", "用户名", "密码"); $pdo->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_BINARY); // 执行查询后直接使用结果 $stmt = $pdo->query("SELECT * FROM 目标表"); $row = $stmt->fetch(PDO::FETCH_ASSOC); // $row中的字符串已为Windows-1250编码
方法2:在连接字符串中指定字符集代码页
pdo_sqlsrv支持在DSN里通过CharacterSet参数指定字符集,直接传入Windows-1250对应的代码页编号1250,驱动会自动完成编码转换:
$dsn = "sqlsrv:Server=你的服务器地址;Database=你的数据库名;CharacterSet=1250"; $pdo = new PDO($dsn, "用户名", "密码"); // 查询返回的字符串即为Windows-1250编码 $stmt = $pdo->query("SELECT * FROM 目标表"); $row = $stmt->fetch(PDO::FETCH_ASSOC);
注意:如果数据库存储的字符集不是Windows-1250,需要先确认数据库实际编码再调整逻辑。比如数据库是UTF-8存储的话,方法1获取的二进制数据还需要用
iconv转码,但这种情况更推荐统一封装转换逻辑,而非零散处理。
内容的提问来源于stack exchange,提问作者baron_bartek
相关产品推荐
相关产品推荐

