因为与其他RDBMS相比,MS SQL Server对UTF-8的支持较差。
MS SQL Server遵循Windows本身使用的约定,即“窄”字符串(char
使用C ++ CHAR
或VARCHAR
SQL)在旧版“代码页” 中编码。代码页的问题是它们的字符数有限(大多数是单字节编码,这将报告格式限制为256个字符),并且围绕一种语言(或具有相似字母的语言组)进行设计。这使得难以存储多语言数据。例如,您不能同时存储俄语和希伯来语数据,因为俄语使用代码页1251,而希伯来语使用代码页1255。
Unicode通过使用一个单一的巨型编码字符集解决了这个问题,该字符集可以容纳超过一百万个字符,足以代表世界上的每种语言。有几种Unicode编码方案。出于历史原因,Microsoft更喜欢使用UTF-16。因为UTF-16将字符串表示为16位代码单元的序列,而不是传统的8位,所以需要单独的字符类型。在MSVC ++中,这是。在MS SQL中,它是或。该代表“国家”,这似乎倒退到我,因为Unicode是约间 -nationalization,但是这是ISO的术语。wchar_t
NCHAR
NVARCHAR
N
其他SQL实现使您可以将UTF-8文本存储在VARCHAR
列中。UTF-8是一种可变长度(每个字符1-4字节)的编码,针对您的数据主要在基本拉丁语范围(表示为每个字符与ASCII相同的1个字节)的情况下进行了优化,但可以表示任何Unicode字符。因此,您可以避免bwalk2895提到的“两倍大的空间”问题。
不幸的是,MS SQL Server 不支持UTF-8VARCHAR
,因此您必须改用UTF-16(并浪费ASCII文本的空间),使用非Unicode代码页(并失去表示外来字符的能力),或将UTF-8存储在BINARY
列中(并处理SQL 字符串函数无法正常工作等不便之处,或者必须在GUI DB管理器中将数据作为十六进制转储查看)。