16

在 SQL Server 中创建表时如何设置字段的默认字符集?在 MySQL 中这样做:

CREATE TABLE tableName (
    name VARCHAR(128) CHARACTER SET utf8
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

请注意,我在这里设置了两次字符集。这是多余的,我添加了两种方式只是为了演示。

我设置排序规则也是为了证明排序规则是不同的。我不是在询问设置排序规则。大多数 关于 SQL Server 中的字符集和编码的问题都是用排序规则来回答的,这不是一回事。

4

2 回答 2

16

如 BOL 所述

每个 SQL Server 排序规则指定三个属性:

  • 用于 Unicode 数据类型(nchar、nvarchar 和 ntext)的排序顺序。排序顺序定义了对字符进行排序的顺序,以及在比较操作中评估字符的方式。
  • 用于非 Unicode 字符数据类型(char、varchar 和 text)的排序顺序。
  • 用于存储非 Unicode 字符数据的代码页。

上面的引用来自 2000 文档。另请参阅此 2008 链接。下面也证明了这一点。

DECLARE @T TABLE 
(
     code TINYINT PRIMARY KEY,
     Arabic_CS_AS CHAR(1) COLLATE Arabic_CS_AS NULL,
     Cyrillic_General_CS_AS CHAR(1) COLLATE Cyrillic_General_CS_AS NULL,
     Latin1_General_CS_AS CHAR(1) COLLATE Latin1_General_CS_AS NULL
);

INSERT INTO @T(code) VALUES (200),(201),(202),(203),(204),(205)

UPDATE @T 
  SET Arabic_CS_AS=CAST(code AS BINARY(1)),
      Cyrillic_General_CS_AS=CAST(code AS BINARY(1)),
      Latin1_General_CS_AS=CAST(code AS BINARY(1))

SELECT * 
FROM @T   

结果

code Arabic_CS_AS Cyrillic_General_CS_AS Latin1_General_CS_AS
---- ------------ ---------------------- --------------------
200  ب            И                      È
201  ة            Й                      É
202  ت            К                      Ê
203  ث            Л                      Ë
204  ج            М                      Ì
205  ح            Н                      Í
于 2011-10-16T10:06:28.327 回答
11

要扩展@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 排序顺序”编号的简单规则,descriptionsys.fn_helpcollations().
    • Windows 排序规则:它们的名称都不SQL_. 这些排序规则允许非 Unicode 字符串数据使用排序规则的 LCID 指示的 Unicode 排序和比较规则。

话虽如此,要找出正在使用的字符集(对于CHARVARCHARTEXT- 即非 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? ”,详细分析这个新特性。

于 2017-02-03T18:31:22.307 回答