SQL Server默认字符编码

时间:2011-03-03 14:40:24

标签: sql-server character-encoding collation

默认情况下 - Microsoft SQL Server中数据库的字符编码集是什么?

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

6 个答案:

答案 0 :(得分:42)

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

SELECT SERVERPROPERTY('Collation')

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

答案 1 :(得分:31)

编码

SQL Server在UCS-2 / UTF-16中存储Unicode数据(即在XMLN - 前缀类型中找到的)(存储是相同的,UTF-16只处理补充字符正确)。这是不可配置的:没有选项可以使用UTF-8或UTF-32。内置函数是否可以正确处理补充字符,以及它们是否被正确排序和比较,取决于所使用的校对。较旧的Collat​​ions将所有补充字符相互等同。从SQL Server 2005开始,他们引入了90系列Collat​​ions(名称中包含_90_的Collat​​ions),它们至少可以对Supplementary Characters进行二进制比较,以便您可以区分它们,即使它们没有& #39;按所需顺序排序。对于SQL Server 2008中引入的100系列排序规则也是如此.SQL Server 2012引入了名称以_SC结尾的排序规则,不仅可以正确排序补充字符,还允许内置函数按预期解释它们(即将代理对视为单个实体)。从SQL Server 2017开始,所有新的排序规则(140系列)implicitly support Supplementary Characters,因此没有名称以_SC结尾的新排序规则。

非Unicode数据(即CHARVARCHARTEXT类型中的数据 - 但不使用TEXT,请使用{ {1}}代替)使用8位编码(扩展ASCII,DBCS或EBCDIC)。特定字符集/编码基于代码页,而代码页又基于列的排序规则,或基于文字和变量的当前数据库的排序规则,或变量/游标名称的实例的排序规则和{ {1}}标签,或VARCHAR(MAX)子句中指定的标签(如果正在使用)。

要了解区域设置如何与排序规则匹配,请查看:

要查看与特定排序规则关联的代码页(这是字符集且仅影响GOTO / COLLATE / CHAR数据),请运行以下命令:

VARCHAR

要查看与特定排序规则关联的LCID(即区域设置)(这会影响排序和比较规则),请运行以下命令:

TEXT

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

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

默认值

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

服务器(实例,实际)默认排序规则用作新创建的数据库的默认值(包括系统数据库:SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'LCID' ) AS [LCID]; SELECT [name], COLLATIONPROPERTY( [name], 'LCID' ) AS [LCID], COLLATIONPROPERTY( [name], 'CodePage' ) AS [CodePage] FROM sys.fn_helpcollations() ORDER BY [name]; master和{{1} })。但这并不意味着任何数据库(4个系统DB除外)都在使用该排序规则。可以随时更改数据库默认排序规则。但是,服务器默认排序规则并不容易更改。服务器/实例排序控件:

  • 本地变量名称
  • CURSOR名称
  • GOTO标签

数据库默认排序规则以两种方式使用:

  • 作为新创建的字符串列的默认值。但这并不意味着任何字符串列都在使用该排序规则。可以随时更改列的排序规则。在这里,了解数据库默认值非常重要,可以指示字符串列最有可能设置的内容。
  • 作为涉及字符串文字,变量和内置函数的操作的排序规则,这些操作不接受字符串输入但产生字符串输出(即model)。在这里,了解数据库默认值非常重要,因为它控制着这些操作的行为方式。

Collat​​ion列在msdbtempdb时的IF (@InputParam = 'something')子句中指定,或者如果未指定,则从数据库默认值中指定。

由于此处有多个图层可以指定排序规则(数据库默认值/列/文字和变量),因此生成的排序规则由Collation Precedence确定。

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

COLLATE

更新2018-10-02

虽然这还不是一个可行的选择,但SQL Server 2019在CREATE TABLE / ALTER TABLE {table_name} ALTER COLUMN数据类型中引入了对UTF-8的本机支持。目前有太多的bug用于它,但如果它们被修复,那么这是一些场景的一个选项。有关此新功能的详细分析,请参阅我的帖子" Native UTF-8 Support in SQL Server 2019: Savior or False Prophet?&#34 ;.

答案 2 :(得分:18)

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

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;

如果使用默认值,则char和varchar数据类型的character_set_name应为iso_1。由于nchar和nvarchar以UCS-2格式存储Unicode数据,因此这些数据类型的character_set_name是UNICODE。

答案 3 :(得分:15)

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

DBName是您的数据库名称。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以看到每个表的排序规则设置,例如以下代码:

SELECT t.name TableName, c.name ColumnName, collation_name  
FROM sys.columns c  
INNER JOIN sys.tables t on c.object_id = t.object_id where t.name = 'name of table';