dav*_*rld 57 sql-server collation character-encoding
默认情况下 - Microsoft SQL Server中数据库的字符编码集是什么?
如何在SQL Server中查看当前字符编码?
Tho*_*eod 45
如果您需要知道新创建的数据库的默认排序规则,请使用:
SELECT SERVERPROPERTY('Collation')
这是您正在运行的SQL Server实例的服务器排序规则.
Sol*_*zky 37
SQL Server存储Unicode数据(即其在发现XML和N-prefixed类型)在UCS-2/UTF-16(存储是相同的,UTF-16仅仅能够正确处理增补字符).这是不可配置的:没有选项可以使用UTF-8或UTF-32.内置函数是否可以正确处理补充字符,以及它们是否被正确排序和比较,取决于所使用的校对.较旧的Collations将所有补充字符相互等同.从SQL Server 2005开始,他们引入了SQL_Collations系列(带有SQL_Latin1_General_CP1_CI_AS在名称中)至少可以对补充字符进行二进制比较,以便您可以区分它们,即使它们没有按所需顺序排序.对于Latin1_General_CI_ASSQL Server 2008中引入的Collations系列也是如此.SQL Server 2012引入了Collations,其名称以90不仅正确排序补充字符的方式结束,但也允许内置函数按预期解释它们(即处理代理对)作为一个单一的实体).从SQL Server 2017开始,所有新的Collations(_90_系列)都隐式支持Supplementary Characters,因此没有新的Collations的名称以100.结尾.
非Unicode数据(即这是在发现_SC,140和_SC类型-但不使用CHAR,使用VARCHAR代替)使用8位编码(扩展ASCII,DBCS,或EBCDIC).特定字符集/编码基于代码页,而代码页又基于列的排序规则,或基于文字和变量的当前数据库的排序规则,或变量/游标名称和TEXT标签的实例排序规则,或者CHAR如果正在使用的话,在子句中指定的内容.
要查看区域设置如何与排序规则匹配,请查看:
要查看与特定排序规则关联的代码页(这是字符集且仅影响VARCHAR/ TEXT/ TEXT数据),请运行以下命令:
SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'CodePage' ) AS [CodePage];
Run Code Online (Sandbox Code Playgroud)
要查看与特定排序规则关联的LCID(即区域设置)(这会影响排序和比较规则),请运行以下命令:
SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'LCID' ) AS [LCID];
Run Code Online (Sandbox Code Playgroud)
要查看可用的排序规则列表及其关联的LCID和代码页,请运行:
SELECT [name],
COLLATIONPROPERTY( [name], 'LCID' ) AS [LCID],
COLLATIONPROPERTY( [name], 'CodePage' ) AS [CodePage]
FROM sys.fn_helpcollations()
ORDER BY [name];
Run Code Online (Sandbox Code Playgroud)
在查看服务器和数据库默认排序规则之前,应该了解这些默认值的相对重要性.
服务器(例如,真)默认排序规则作为默认为新创建的数据库(包括系统数据库:VARCHAR(MAX),GOTO,COLLATE,和CHAR).但这并不意味着任何数据库(4个系统DB除外)都在使用该排序规则.可以随时更改数据库默认排序规则.但是,服务器默认排序规则并不容易更改.服务器/实例排序控件:
数据库默认排序规则以两种方式使用:
VARCHAR).在这里,了解数据库默认值非常重要,因为它控制着这些操作的行为方式.列排序规则要么中指定TEXT子句的时间master或model,或者,如果未指定,从数据库默认采取.
由于此处有多个层可以指定排序规则(数据库默认值/列/文字和变量),因此生成的排序规则由排序规则优先顺序确定.
所有这些,以下查询显示了操作系统,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;
Run Code Online (Sandbox Code Playgroud)
更新2018-10-02
虽然这还不是一个可行的选择,但SQL Server 2019在msdb/ tempdbdatatypes中引入了UTF-8的原生支持.目前有太多的bug用于它,但如果它们被修复,那么这是一些场景的选项.请参阅我的帖子," SQL Server 2019中的原生UTF-8支持:救世主还是假先知? ",详细分析了这一新功能.
Rob*_*com 19
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;
Run Code Online (Sandbox Code Playgroud)
如果它使用默认值,则char和varchar数据类型的character_set_name应为iso_1.由于nchar和nvarchar以UCS-2格式存储Unicode数据,因此这些数据类型的character_set_name是UNICODE.