在Centos7 中PHP与SQL Server链接出现的编码问题

发布时间 2023-03-23 12:54:31作者: 光和环

项目一直处于Windows平台,变更到linux上移植的时候发现了一个严重的字符编码问题。

服务器情况如下

数据服务器Windows 2016 + SQLServer 2008R2

原Web服务器Windows 2016 自带IIS10  + PHP5.4

新Web服务器Centos7

大家都知道SQLServer 安装时候的默认有一项排序规则是Chinese_PRC_CI_AS

Chinese_PRC:是指中国大陆的简体字UNICODE的排序规则。
CI:CaseSensitivity,指定不区分大小写。
AS:AccentSensitivity,指定区分重音。

在SQLServer中并没有独立的字符编码选项,所以一切与编码有关的内容都在排序规则中,在我们使用Chinese_PRC_CI_AS时

varchar类型时 存到表里的数据是GBK编码

nvarchar类型是 存储的是UTF-16编码 (包括emoji表情)

更过关于SQLServer字符编码、排序规则的内容不在此赘述,自行搜索。

 

综上我们的php使用了UTF8编码,所以对SQLServer读写封装了转码操作。

在Linux中安装SQLServer驱动后用移植的项目运行后出现了乱码问题!同样的代码在Centos7中怎么就乱码了呢?

去掉转码所有读写就都正常了,但是UTF8页面与GBK数据库表的读写竟然不需要转换编码就可以正常读写很不可思议。

为了这个搞清楚出现问题花了一天的时间研究整个安装过程并没有找到可以改变字符编码的配置文件,最后查阅了Microsoft文档,发现SQLServer驱动遵循了Centos的系统语言配置。

也就是/etc/locale.conf中的设置,调整后可以使Centos7的SQLServer操作与Windows保持一致。