默认情况下 - Microsoft SQL Server中数据库的字符编码集是什么?
如何在SQL Server中查看当前字符编码?
答案 0 :(得分:42)
如果您需要知道新创建的数据库的默认排序规则,请使用:
SELECT SERVERPROPERTY('Collation')
这是您正在运行的SQL Server实例的服务器排序规则。
答案 1 :(得分:31)
SQL Server在UCS-2 / UTF-16中存储Unicode数据(即在XML
和N
- 前缀类型中找到的)(存储是相同的,UTF-16只处理补充字符正确)。这是不可配置的:没有选项可以使用UTF-8或UTF-32。内置函数是否可以正确处理补充字符,以及它们是否被正确排序和比较,取决于所使用的校对。较旧的Collations将所有补充字符相互等同。从SQL Server 2005开始,他们引入了90
系列Collations(名称中包含_90_
的Collations),它们至少可以对Supplementary Characters进行二进制比较,以便您可以区分它们,即使它们没有& #39;按所需顺序排序。对于SQL Server 2008中引入的100
系列排序规则也是如此.SQL Server 2012引入了名称以_SC
结尾的排序规则,不仅可以正确排序补充字符,还允许内置函数按预期解释它们(即将代理对视为单个实体)。从SQL Server 2017开始,所有新的排序规则(140
系列)implicitly support Supplementary Characters,因此没有名称以_SC
结尾的新排序规则。
非Unicode数据(即CHAR
,VARCHAR
和TEXT
类型中的数据 - 但不使用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除外)都在使用该排序规则。可以随时更改数据库默认排序规则。但是,服务器默认排序规则并不容易更改。服务器/实例排序控件:
数据库默认排序规则以两种方式使用:
model
)。在这里,了解数据库默认值非常重要,因为它控制着这些操作的行为方式。 Collation列在msdb
或tempdb
时的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';