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作為默認字符編碼,但微軟就是不支持。