2011-10-15 80 views
11

在SQL Server中创建表时,如何设置字段的默认字符集?在MySQL中是这样的:SQL Server:设置字符集(不归类)

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

请注意,我在这里设置了两次字符集。这是多余的,我添加了两种方式来证明。

我还设置了排序规则,以证明排序规则是不同的。我是而不是询问设置排序规则。 Mostquestions询问有关SQL Server中的字符集和编码是否与排序对应,即而不是是同样的事情。

+5

他们是在SQL Server同样的事情。通过在'varchar'列上设置排序规则,您还可以设置代码页。 –

+0

谢谢Martin。记录在哪里?当然,我通过精细的手册(MSDN在线),但我没有看到它。 – dotancohen

+1

排序规则控制SQL Server中字符串的物理存储。排序规则指定[** both **]代表每个字符的位模式**和**字符排序和比较的规则。 [链接](http://msdn.microsoft.com/en-us/library/ms186356.aspx) –

回答

13

As stated in BOL

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

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

以上引用来自2000文档。 See also this 2008 link。下面也演示了这一点。

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 ح   Н      Í 
+0

谢谢Martin。不幸的是,他们选择了误导性/不完整的术语“整理”,它明确指出排序顺序:[整理定义](http://dictionary.reference.com/browse/collat​​e)。它似乎也不能因此使用此设置使用自定义排序规则(我有一个与自定义排序规则无关的PHP/MySQL应用程序)。顺便说一句,我喜欢这个优雅的例子! – dotancohen

+0

@dotancohen - 您可以使用明确的“collat​​e”子句来使用不同的比较语义,但不能定义自己的排序规则。 –

+0

@Martin Smith你的答案是grate ....所有问题都取决于数据库创建的时刻......选择适当的排序规则非常重要.. –

6

为了扩大对@马丁的回答是:

您在SQL Server中如何设置 “字符集” 取决于你所使用的数据类型。如果您正在使用:

  • NVARCHARNCHARNTEXTNTEXT已被弃用,不应该被用来作为的SQL Server 2005)都使用Unicode字符集,这不能被改变。这些数据类型全部编码为UTF-16 LE(Little Endian)– 16位编码,每个“字符”为2或4字节–,这也不能改变。对于这些数据类型,正在使用的排序规则仅影响区域设置(由Collat​​ion的LCID确定),它确定用于排序和比较的规则集。

  • XML,像N -prefixed类型,使用Unicode字符集和被编码为UTF-16 LE(小端),和既不那些可以改变。但与其他字符串数据类型不同,没有与XML数据关联的归类,因为它不能被排序或比较(至少先不将其转换为NVARCHAR(MAX) [首选]或VARCHAR(MAX))。

  • VARCHARCHAR,和TEXTTEXT已被废弃,不应该被用作的SQL Server 2005)都为8位编码,每个“字”是1或2个字节。字符集由与每个归类关联的代码页确定。的排序和比较规则取决于整理的类型使用:

    • SQL Server排序规则:这些都开始SQL_名称和自SQL Server 2000中已被否决,虽然是(不幸)仍被广泛使用的今天。这些使用简单规则,如sys.fn_helpcollations()返回的description字段中所示的“SQL Server排序顺序”编号。
    • 窗口排序规则:这些都有名字,做不是开始于SQL_。这些排序规则允许非Unicode字符串数据使用排序规则的LCID指示的Unicode排序和比较规则。

话虽这么说,找出哪些字符集(CHARVARCHARTEXT –即非Unicode –数据)正在被使用,运行下面的查询,并密切关注CodePage领域。该LCID字段表示用于排序和比较规则为N -prefixed –即统一–类型以及非Unicode类型如果使用Windows排序规则的语言环境:

SELECT *, 
     COLLATIONPROPERTY(col.[name], 'CodePage') AS [CodePage], 
     COLLATIONPROPERTY(col.[name], 'LCID') AS [LCID] 
FROM sys.fn_helpcollations() col 
ORDER BY col.[name]; 

代码页ID可以通过Code Page Identifiers的MSDN页面翻译成更有意义的内容。


关于O.P.上@的comment马丁的回答是:

不幸的是,他们选择了误导性/不完整的术语“整理”,这显然是指排序顺序:整理定义。

尽管微软在选择名称时可以做得更好,但不幸的是,在诸如“编码”,“字符集”,“整理”等术语方面存在一般性的,整个行业的混淆。微软对“整理”的使用(或滥用)仅仅造成了大规模混乱。但是,由于“utf8”具体是而不是字符集,所以在MySQL中这种混淆也很明显.--)。

UTF-8是Unicode字符集的几种编码之一。另外两种编码是UTF-16和UTF-32。所有这三种编码都以不同的方式表示完全相同的Unicode字符集。查看MySQL字符集列表– 11.1.10 Supported Character Sets and Collations –“ucs2”,“utf8”,“utf8mb4”,“utf16”,“utf16le”,“utf32”字符集实际上并不是字符集,而是各种表示形式的字符集Unicode字符集。但是,鉴于“字符集”和“编码”这两个概念之间的重叠,难以避免混淆。11.1.10.1 Unicode Character Sets页面指示“utf8mb4”,“utf16”,“utf16le”和“utf32”字符集是完整的Unicode字符集,而“ucs2”和“utf8”是Unicode字符集的子集,特别是第65,536个代码点(又称Basic Multilingual Plane(BMP))。

有关跨各种RDBMS的排序规则的详细信息,请参阅我的回答下面的问题上DBA.StackExchange:

Does any DBMS have a collation that is both case-sensitive and accent-insensitive?

+0

我觉得这是一个更好的解释,那么最初接受的是什么。 – Exocomp