关于ZCMS在SQLServer下的字符集问题

UTF-8是Unicode的一种编码方式,SQLServer并不支持UTF-8,而是支持另一种Unicode编码方式UCS-2,通常情况下,大陆的简体中文的SQLServer会指定Chinese_PRC_CI_AS为默认排序规则,区域设置LCID为2052(0x804),字符集代码页为936。在这样设置的SQLServer服务器中,nchar/nvarchar使用UCS-2编码(这是独立于排序规则的),char/varchar使用cp936(近似GBK)编码,以上字符串均按不区分大小写(CI)、区分重音(AS)、不区分假名、不区分全半角的方式排序。

而在JVM中字符串在内存中实际存储的格式也是UCS-2,因此在通过JDBC插入到nvarchar或通过JDBC读取nvarchar字段都不会有乱码问题。

由于ZCMS为SQLServer生成的表结构中的所有字符串字段都被设置成了nvarchar,所以在通常的简体中文SQLServer中不需要做任何改动就可以直接连接数据库正常操作,数据通过JDBC插入、读取、在SQL中排序、比较、以及在SQLServer的查询分析器中查看等操作都不会有问题,也不需要将ZCMS的UTF-8版本转换成GBK版本。

PS1:这种处理方式没有任何问题,但在数据库中存储的并不是UTF-8,而是UCS-2。

PS2: UCS-2在不同的平台上字节顺序不一样,需要BOM来确定字节顺序,通用性不如UTF-8。出于国际化和平台独立性的考虑,大部分网站都采用UTF-8作为默认字符编码,但微软就是不支持。

hackIE