在SQL Server中存储UTF-16/Unicode数据

5 sql-server unicode ucs2 utf-16

根据这个,SQL Server的2K5使用UCS-2的内部.它可以在UCS-2中存储UTF-16数据(具有适当的数据类型,nchar等),但是如果存在补充字符,则将其存储为2个UCS-2字符.

这带来了字符串函数的明显问题,即SQL Server将一个字符视为2.

我有点惊讶的是,SQL Server基本上只能处理UCS-2,甚至更多,因此SQL 2K8中没有修复它.我很欣赏其中一些角色可能并不常见.

除了本文中建议的功能之外,还有关于在SQL Server 2K5中处理(损坏的)字符串函数和UTF-16数据的最佳方法的任何建议.

Con*_*net 6

SQL Server 2012现在支持UTF-16,包括代理对.请参阅http://msdn.microsoft.com/en-us/library/ms143726(v=sql.110).aspx,尤其是"补充字符"部分.

因此,对原始问题的一个修复是采用SQL Server 2012.


Ric*_*ick 3

字符串函数可以很好地处理 unicode 字符串;关心字符数的人将两字节字符视为单个字符,而不是两个字符。唯一需要注意的是 len() 和 datalength(),它们在使用 unicode 时返回不同的值。当然,它们返回正确的值 - len() 返回以字符为单位的长度,而 datalength() 返回以字节为单位的长度。它们只是由于两字节字符而恰好不同。

因此,只要您在代码中使用正确的函数,一切都应该透明地工作。

编辑:刚刚仔细检查过联机丛书,自 SQL Server 2000 以来,unicode 数据就可以与字符串函数完美配合。

编辑2:正如评论中所指出的,SQL Server的字符串函数不支持完整的Unicode字符集,因为缺乏对解析平面0之外的代理的支持(或者,换句话说,SQL Server的字符串函数最多只能识别2个)每个字符的字节数。)SQL Server 将正确存储和返回数据,但是任何依赖于字符计数的字符串函数都不会返回预期值。绕过此问题的最常见方法似乎是在 SQL Server 外部处理字符串,或者使用 CLR 集成添加 Unicode 感知字符串处理函数。

  • 你误解了这个问题。UTF-16 允许使用补充字符。其工作原理是将单个字符(从用户的角度来看)存储在 2 个代码单元(即 4 个字节)中。UCS-2 不处理增补字符。因此,4 个字节被 SQL Server 视为两个字符,而实际上它是一个字符。 (5认同)
  • 是的,但它*不*支持完整的 unicode 字符集。 (2认同)