要扩展@Martin 的答案:
如何在 SQL Server 中设置“字符集”取决于您使用的数据类型。如果您正在使用:
NVARCHAR
, NCHAR
, 和NTEXT
(NTEXT
已弃用,自 SQL Server 2005 起不应使用) 都使用 Unicode 字符集,并且无法更改。这些数据类型都被编码为 UTF-16 LE(Little Endian)——一种 16 位编码,每个“字符”为 2 或 4 个字节——这也无法更改。对于这些数据类型,使用的排序规则仅影响区域设置(由排序规则的 LCID 确定),该区域确定用于排序和比较的规则集。
XML
,与N
-prefixed 类型一样,使用 Unicode 字符集并编码为 UTF-16 LE(Little Endian),并且这些都不能更改。但与其他字符串数据类型不同,没有与XML
数据关联的排序规则,因为它无法排序或比较(至少在没有首先将其转换为NVARCHAR(MAX)
[preferred] 或的情况下不会VARCHAR(MAX)
)。
VARCHAR
, CHAR
, 和TEXT
(TEXT
已弃用,自 SQL Server 2005 起不应使用) 都是 8 位编码,每个“字符”为 1 或 2 个字节。字符集由与每个排序规则关联的代码页确定。排序和比较规则取决于所使用的排序规则的类型:
- SQL Server 排序规则:这些名称都以 SQL Server 2000 开头
SQL_
并已被弃用,但(不幸的是)今天仍在广泛使用。这些使用表示为“SQL Server 排序顺序”编号的简单规则,description
如sys.fn_helpcollations()
.
- Windows 排序规则:它们的名称都不以
SQL_
. 这些排序规则允许非 Unicode 字符串数据使用排序规则的 LCID 指示的 Unicode 排序和比较规则。
话虽如此,要找出正在使用的字符集(对于CHAR
、VARCHAR
和TEXT
- 即非 Unicode - 数据),请运行以下查询并密切关注该CodePage
字段。如果使用 Windows 排序规则,该字段指示用于- 前缀(即 Unicode)类型以及非 Unicode 类型LCID
的排序和比较规则的区域设置:N
SELECT *,
COLLATIONPROPERTY(col.[name], 'CodePage') AS [CodePage],
COLLATIONPROPERTY(col.[name], 'LCID') AS [LCID]
FROM sys.fn_helpcollations() col
ORDER BY col.[name];
代码页 ID 可以通过代码页标识符的 MSDN 页面转换为更有意义的内容。
关于 OP对@Martin 回答的评论:
不幸的是,他们选择了具有误导性/不完整的术语“整理”,它明确指的是排序顺序:整理定义。
虽然微软在选择名称时确实可以做得更好,但不幸的是,对于“编码”、“字符集”、“排序规则”等术语,整个行业都存在普遍的混淆。微软的使用(或误用) “整理”只是造成了大众的混乱。但是,这种混淆在 MySQL 中也很明显,如这个问题所示,因为“utf8”特别不是字符集;-)。
UTF-8 是 Unicode 字符集的几种编码之一。UTF-16 和 UTF-32 是另外两种编码。所有这三种编码都表示完全相同的 Unicode 字符集,只是方式不同。查看 MySQL 字符集列表——11.1.10 支持的字符集和排序规则——“ucs2”、“utf8”、“utf8mb4”、“utf16”、“utf16le”、“utf32”字符集实际上并不是字符集,每se,但 Unicode 字符集的各种表示形式。但是,鉴于“字符集”和“编码”概念之间的重叠,很难不产生这种混淆。11.1.10.1 Unicode 字符集page 表示“utf8mb4”、“utf16”、“utf16le”和“utf32”字符集是完整的 Unicode 字符集,而“ucs2”和“utf8”是 Unicode 字符集的子集,特别是前 65,536 个代码点(又名基本多语言平面(BMP))。
有关跨各种 RDBMS 的排序规则的更多信息,请参阅我在 DBA.StackExchange 上对以下问题的回答:
是否有任何 DBMS 具有区分大小写和不区分重音的排序规则?
更新 2018-10-02
虽然这还不是一个可行的选项,但 SQL Server 2019 在VARCHAR
/CHAR
数据类型中引入了对 UTF-8 的本机支持。目前它有太多的错误无法使用,但如果它们被修复,那么这是某些场景的一个选项。请参阅我的帖子“ SQL Server 2019 中的 Native UTF-8 Support: Savior or False Prophet? ”,详细分析这个新特性。