SQL Server的默认字符编码
默认情况下 – Microsoft SQL Server中为数据库设置的字符编码是什么?
如何在SQL Server中看到当前的字符编码?
如果您需要知道新创build的数据库的默认sorting规则,请使用:
SELECT SERVERPROPERTY('Collation')
这是您正在运行的SQL Server实例的服务器sorting规则。
编码
SQL Server存储UCS-2 / UTF-16(存储相同,UTF-16仅正确处理补充字符)中的Unicode数据(即在XML
和N
前缀types中find的数据)。 这是不可configuration的:没有select使用UTF-8或UTF-32。 内置函数是否可以正确处理补充字符以及是否对这些字符进行了sorting和比较,取决于所使用的sorting规则。 较旧的Collations等同所有补充字符彼此。 从SQL Server 2005开始,他们引入了大约90
系列的sorting规则,至less可以对补充字符进行二进制比较,以便可以区分它们,即使它们没有按照所需的顺序进行sorting。 这可能也适用于在SQL Server 2008中引入的100
个Collations系列.SQL Server 2012引入了Collations,名称以_SC
结尾,不会对补充字符进行正确sorting,但也允许内置函数根据预期进行解释。
非Unicode数据(即在CHAR
和VARCHAR
types中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的数据库(包括系统数据库: model
, msdb
和tempdb
)的默认值。 但这并不意味着任何数据库(3系统数据库除外)正在使用该sorting规则。 数据库默认的sorting可随时更改。 但是,服务器默认的sorting规则并不容易改变。 服务器/实例整理控制:
- 局部variables名称
- CURSOR名称
- GOTO标签
数据库默认sorting有两种使用方式:
- 作为新创build的string列的默认值。 但是,这并不意味着任何string列正在使用该sorting规则。 列的整理可随时更改。 在这里,知道数据库的默认值是很重要的,因为这是string列最可能设置的指示。
- 作为涉及string文字,variables和内置函数的操作的sorting规则,它们不接受stringinput,而是产生一个string输出(即
IF (@InputParam = 'something')
)。 这里知道数据库的默认值是非常重要的,因为它决定了这些操作的行为。
COLLATE
列可以在CREATE TABLE
或ALTER 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。