我在两个不同的共享服务器(一个Windows和另一个Linux)中托管了完全相同的应用程序,它们都使用PDO连接在同一SQL Server数据库中。
在其中一台服务器(Linux操作系统)中,某种方式将来自SQL Server的所有特殊字符(例如é,ç,ome)替换为。。
数据库字符集为Latin1_General_CI_AS
,并且我将以下标头发送到浏览器:
<meta charset="UTF-8">
这是我与PDO的联系:
$DBH = new PDO('dblib:host=111.111.111.11;dbname=mydbname;charset=utf8','myuser','mypass')
我的问题是:我怎么能知道这里发生了什么,为什么同一个应用程序可以在一台服务器上正常运行而不能在另一台服务器上正常运行。也许是在php.ini或PDO对象中进行了某些配置?
我已经下载了Chrome插件,该插件可让您更改页面的字符编码。当我将其更改为“ Windows-1252”时,来自数据库的数据会正确显示,但是页面上由PHP动态生成的任何其他元素都将特殊字符替换为ç和ã等符号。
请不要将此问题标记为重复,因为不是;我无法将数据库字符集更改为UTF-8。而且由于该应用程序可以在Windows服务器上正常运行,所以我认为我可以做一些事情来解决Linux服务器上的问题,除了弄乱数据库配置(我目前无法访问)。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
除了通过设置<meta charset="utf-8"/>
已经完成的客户端编码,您还必须同时设置连接编码(对于两个应用程序)。
对于PHP,this post中可接受的答案建议您执行以下操作:
ini_set('mssql.charset', 'UTF-8');
编辑:
对于PDO,您可以在连接字符串中传递它。示例:
$DBH = new PDO('mssql:dbname=spr_bank;host=hostname;charset=utf8', $userDB, $passwordDB);
注意,这不会将您的实际表更改为UTF-8。这只会为您的连接转换字符集,使其读取/写入正确的字符。即使它是Latin1_General_CI_AS
表/数据库。
答案 1 :(得分:1)
这是解决我的问题的方法:
[sqlservername] host=111.111.111.11 port=1433 tds version=7.0 client charset=UTF-8
确保您的连接DSN使用的是服务器名,而不是IP:
'dsn'=>'dblib:host = sqlservername; dbname = yourdb
使FreeTDS可以通过环境变量从本地脚本中以非特权用户的身份使用本地freetds.conf文件。
putenv('FREETDSCONF = / your / local / freetds.conf');