SQL Server的默认字符编码

默认情况下 – Microsoft SQL Server中为数据库设置的字符编码是什么?

如何在SQL Server中看到当前的字符编码?

如果您需要知道新创build的数据库的默认sorting规则,请使用:

SELECT SERVERPROPERTY('Collation')

这是您正在运行的SQL Server实例的服务器sorting规则。

编码

SQL Server存储UCS-2 / UTF-16(存储相同,UTF-16仅正确处理补充字符)中的Unicode数据(即在XMLN前缀types中find的数据)。 这是不可configuration的:没有select使用UTF-8或UTF-32。 内置函数是否可以正确处理补充字符以及是否对这些字符进行了sorting和比较,取决于所使用的sorting规则。 较旧的Collat​​ions等同所有补充字符彼此。 从SQL Server 2005开始,他们引入了大约90系列的sorting规则,至less可以对补充字符进行二进制比较,以便可以区分它们,即使它们没有按照所需的顺序进行sorting。 这可能也适用于在SQL Server 2008中引入的100个Collat​​ions系列.SQL Server 2012引入了Collat​​ions,名称以_SC结尾,不会对补充字符进行正确sorting,但也允许内置函数根据预期进行解释。

非Unicode数据(即在CHARVARCHARtypes中find的数据)是8位扩展ASCII或EBCDIC。 特定字符集基于代码页,而代码页又基于列的整理,或当前数据库的文字和variables的整理,或者在使用COLLATE子句时指定的内容。

要查看语言环境如何匹配sorting规则,请查看:

  • Windows整理名称
  • SQL Server整理名称

要查看与特定归类关联的代码页(这只影响CHAR / VARCHAR数据),请运行以下命令:

 SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'CodePage' ) AS [CodePage]; 

要查看与特定归类(仅影响NCHAR / NVARCHAR数据)关联的LCID(即语言环境),请运行以下命令:

 SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'LCID' ) AS [LCID]; 

要查看可用的sorting规则列表及其关联的LCID和代码页,请运行:

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

默认

在查看服务器和数据库默认sorting规则之前,应该了解这些默认设置的相对重要性。

Server(Instance,really)默认的sorting规则用作新创build的数据库(包括系统数据库: modelmsdbtempdb )的默认值。 但这并不意味着任何数据库(3系统数据库除外)正在使用该sorting规则。 数据库默认的sorting可随时更改。 但是,服务器默认的sorting规则并不容易改变。 服务器/实例整理控制:

  • 局部variables名称
  • CURSOR名称
  • GOTO标签

数据库默认sorting有两种使用方式:

  • 作为新创build的string列的默认值。 但是,这并不意味着任何string列正在使用该sorting规则。 列的整理可随时更改。 在这里,知道数据库的默认值是很重要的,因为这是string列最可能设置的指示。
  • 作为涉及string文字,variables和内置函数的操作的sorting规则,它们不接受stringinput,而是产生一个string输出(即IF (@InputParam = 'something') )。 这里知道数据库的默认值是非常重要的,因为它决定了这些操作的行为。

COLLATE列可以在CREATE TABLEALTER TABLE {table_name} ALTER COLUMN时在COLLATE子句中指定,或者如果未指定,则从数据库默认值中指定。

由于在这里可以指定sorting规则(数据库默认值/列/文字和variables),因此可以通过归类优先级确定结果归类。

所有这一切,下面的查询显示操作系统,SQL Server实例和指定的数据库的默认/当前设置:

 SELECT os_language_version, --- SERVERPROPERTY('LCID') AS 'Instance-LCID', SERVERPROPERTY('Collation') AS 'Instance-Collation', SERVERPROPERTY('ComparisonStyle') AS 'Instance-ComparisonStyle', SERVERPROPERTY('SqlSortOrder') AS 'Instance-SqlSortOrder', SERVERPROPERTY('SqlSortOrderName') AS 'Instance-SqlSortOrderName', SERVERPROPERTY('SqlCharSet') AS 'Instance-SqlCharSet', SERVERPROPERTY('SqlCharSetName') AS 'Instance-SqlCharSetName', --- DATABASEPROPERTYEX(N'{database_name}', 'LCID') AS 'Database-LCID', DATABASEPROPERTYEX(N'{database_name}', 'Collation') AS 'Database-Collation', DATABASEPROPERTYEX(N'{database_name}', 'ComparisonStyle') AS 'Database-ComparisonStyle', DATABASEPROPERTYEX(N'{database_name}', 'SQLSortOrder') AS 'Database-SQLSortOrder' FROM sys.dm_os_windows_info; 

SELECT DATABASEPROPERTYEX('DBName', 'Collation') SQLCollation;

DBName是您的数据库名称。

SQL Server数据库的默认字符编码是ISO_1,即ISO 8859-1。 请注意,字符编码取决于列的数据types。 您可以了解用于数据库中的列的字符编码以及使用此SQL的sorting规则:

 select data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, count(*) count from information_schema.columns group by data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name; 

如果使用的是默认值,那么character_set_name应该是char_1和varchar数据types的iso_1。 由于nchar和nvarchar以UCS-2格式存储Unicode数据,因此这些数据types的character_set_name是UNICODE。

我认为这是值得的一个单独的答案:虽然内部unicode数据在Sql Server中存储为UTF-16这是Little Endian的味道,所以如果你从外部系统调用数据库,你可能需要指定UTF- 16LE。