正确设置与使用SQL Server的字符集(Collation,即排序规则)

原创 2016年01月26日 17:19:20

目录

正确认识SQL Server的字符集

SQL Server作为一个国际化产品,支持多语言环境。在SQL Server中,字符集被称为排序规则(即Collation)。排序规则不仅影响记录行的sort顺序,还影响中文显示是否乱码等。在SQL Server中,排序规则可在3处地方设置:

服务器级别 =>instances
db库级别 =>databases
表列级别 =>columns

Created with Raphaël 2.1.0instancesdatabasescolumns

上图所示为SQL Server默认情况下对Collation继承的方式。

即在SQL Server软件安装时我们可设置服务器级别的排序规则,也就是instances的排序规则。如下所示是使用T-SQL查询当前instances的排序规则信息:

--查询当前SQL Server服务器的排序规则
SELECT SERVERPROPERTY(N'Collation')
--------------------------------------------------
Chinese_PRC_CI_AS

当然你也可以使用SSMS查看服务器属性:
服务器排序规则

若在创建databases时我们未指定排序规则,databases则会使用instances的排序规则。如下所示是通过sql代码查询或修改SQL Server中databases的排序规则信息:

--在创建database时指定排序规则:SQL_Latin1_General_CP1_CI_AS
USE master;
GO

CREATE DATABASE mydb
COLLATE SQL_Latin1_General_CP1_CI_AS
GO

--通过目录视图sys.databases查询databases的排序规则
SELECT
    name,
    collation_name
FROM sys.databases
WHERE name = N'mydb';
-------------------------------------------------
mydb    SQL_Latin1_General_CP1_CI_AS

--修改现有databases的排序规则
ALTER DATABASE mydb
COLLATE Chinese_PRC_CI_AS

而表中的列(columns)默认情况是继承databases的排序规则(除非在创建表时对列的排序规则进行指定),我们可通过目录视图sys.columns查询表中columns的排序规则信息。

这里需注意:SQL Server的排序规则只影响字符型的列,如char, varchar, text, nchar, nvarchar, ntext,因此目录视图sys.columns中非字符型的排序规则显示为NULL

--注意:只有字符型的列才会显示排序规则信息,非字符型的显示为NULL
SELECT name, collation_name
FROM sys.columns
where collation_name is NOT NULL

选择合适的SQL Server字符集

在安装SQL Server时,你可能困惑应该选择哪种字符集,SQL Server或者Windows的。官方推荐使用SQL Server的字符集,而非Windows的字符集。原因是,SQL Server字符集是基于Windows衍生出来的,同时保证SQL Server版本间的兼容性, 如SQL Server 2014可使用的字符集比2008多

--查看当前SQL Server支持的排序规则
SELECT * from ::fn_helpcollations()

注意字符集的名字缩写与对应的的描述,如CI表示不区分大小写、
支持的排序规则

错误使用SQL Server的字符集

我们不难理解:只需保持SQL Server中3处字符集设置的地方:instances、databases、columns设置一致即是正确的使用方式。

那么当SQL Server中instances与databases对排序规则设置不一致时,将直接导致临时表#或##不能正常使用(临时表的列默认继承tempdb的排序规则,而tempdb则继承了instances的排序规则)。

/*
注意:
 这里mydb的字符集是SQL_Latin1_General_CP1_CI_AS,
 而instance的字符集是Chinese_PRC_CI_AS
*/
USE mydb;
GO

--在mydb中创建一张表collation_test
CREATE TABLE collation_test (hyper varchar(10));
GO

--创建临时表collation_temp
CREATE TABLE #collation_temp (hyper varchar(10));
GO

连接查询上述临时表的内容时,将出现如下报错信息:

--查询报错
SELECT  *
FROM collation_test l
LEFT JOIN #collation_temp c
    ON l.hyper = c.hyper;
--------------------------------------------
Msg 468, Level 16, State 9, Line 4
无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突。

其根本原因是由于表collation_test与临时表#collation_temp中列的排序规则不一致。虽然可以通过以下2种方式继续使用临时表,但并不推荐。如下通过指定select表中列的排序规则,继续使用上述两张表。

--方式1:
--注意指定表collation_test使用排序规则COLLATE Chinese_PRC_CI_AS
SELECT  *
FROM collation_test l 
LEFT JOIN #collation_temp c 
    ON l.hyper COLLATE Chinese_PRC_CI_AS = c.hyper
------------------------------------------------------- 

第二种解决方法则是在创建表时指定列的排序规则

--方式2
USE mydb;
GO

--注意指定了列的排序规则:COLLATE Chinese_PRC_CI_AS
CREATE TABLE collation_Wang
(hyper varchar(10) COLLATE Chinese_PRC_CI_AS);

--保持列的排序规则一致即可正常使用临时表#collation_temp
SELECT  *
FROM collation_wang w
LEFT JOIN #collation_temp c 
    ON w.hyper = c.hyper
-------------------------------------------------------

同时instances的排序规则设置会影响SQL Server数据的导入导出功能。

通常我们遇到的另一个问题是:通过SSMS(即SQL Server Management Studio)插入(insert)的中文,在查询时显示乱码(即问号?)。

--在上述表collation_test插入中文
INSERT INTO collation_test VALUES ('东') 

--查询表collation_test的记录
select * from collation_test

查询显示乱码:
中文乱码

这当然是由于表collation_test上hyper列的字符集设置不正确所导致的。但若你有幸在表上使用了nvarchar等类型,那么当出现上述乱码时,也许你还可以使用如下临时方式补救:

/* 
注意:
    数据库mydb依旧是使用错误的排序规则:SQL_Latin1_General_CP1_CI_AS,
    但是表collation_nvarchar使用了nvarchar类型,而非varchar
 */
USE mydb;
GO
CREATE TABLE collation_nvarchar (hyper nvarchar(10));
GO

--临时处理方式
INSERT INTO collation_nvarchar VALUES (N'东'); 

--错误插入方式
INSERT INTO collation_nvarchar VALUES ('东'); 

--查询表collation_nvarchar的记录
select * from  collation_nvarchar

nvarchar

综上述,我们应尽可能的正确设置SQL Server排序规则:
1. 正确的设置SQL Server排序规则 ,保持instances、databases、columns中3处排序规则一致,推荐使用Chinese_PRC_CI_AS
2. 尽可能使用nvarchar等Unicode类型,而非varchar类型

参考资料

  1. Setting and Changing the Database Collation
    https://msdn.microsoft.com/en-us/library/ms175835(v=sql.105).aspx

  2. sys.columns (Transact-SQL)
    https://msdn.microsoft.com/en-us/library/ms176106(v=sql.120).aspx

  3. Collation and International Terminology
    https://msdn.microsoft.com/en-us/library/ms143726(v=sql.105).aspx

版权声明:本文为博主HyperWang原创文章,使用"CC 署名-非商业性使用-禁止演绎 4.0 国际"进行分享。

SQL SERVER 不同语言字符集的比较问题

环境: window 7+sqlserver 2008 同一电台上有两个数据库DB1、DB2 DB1数据库字符集: SQL_Latin1_General_CP1_CI_AS DB2数据库字符集...
  • hdhai9451
  • hdhai9451
  • 2012年02月15日 16:17
  • 3393

sqlserver的字符集配置

记录一点数据库的知识 背景: 1.echo命令可以将内容直接写到文本中,格式为: echo [content] > [filepath] 一个大于号是创建文件,两个是append。 2.Sql...
  • wwwcomy
  • wwwcomy
  • 2015年10月13日 15:06
  • 2326

SQL SERVER 字符集问题之一解决

  • 2015年07月25日 14:34
  • 14KB
  • 下载

查看SQLserver编码格式的SQL语句 及 Sqlserver排序规则

SELECT  COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage') 下面是查询结果: 936 简体中文GBK 950 ...
  • chx10051413
  • chx10051413
  • 2013年11月21日 14:59
  • 5099

修改sqlserver 的编码格式

今天在使用SQL Server时,由于之前创建数据库忘记了设置Collocation,数据库中插入中文字符都是乱码,于是到DataBase的Options中修改Collocation,出现了The d...
  • zml_900417520
  • zml_900417520
  • 2016年01月08日 12:14
  • 5113

关于SQL SERVER排序规则

 一、排序规则简介: 什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server  中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用...
  • feixianxxx
  • feixianxxx
  • 2009年10月05日 12:01
  • 25138

Sql Server排序规则的简介、选择、应用

 一、排序规则简介:什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server  中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的...
  • cxyyxc
  • cxyyxc
  • 2007年08月12日 22:28
  • 1897

修改sql server数据库默认排序规则

公司新换了一批电脑。同事帮我把开发工具都装好了。使用sqlserver2012时,发现 sqlcollation 用的是 Chinese_PRC_CI_AS 。我需要  SQL_Latin1_Gene...
  • lichxi1002
  • lichxi1002
  • 2014年02月21日 11:17
  • 5143

深入SQL Server 排序规则的原理

之前一篇文章讲了排序规则的基本概念和误区。今天的文章我主要针对论坛里面一个朋友问他问题,深入的讲下排序规则。这些东西是我感觉我查了很多资料和博客都没有讲到的内容。希望能够帮助大家更加深入的了解他的工作...
  • z10843087
  • z10843087
  • 2017年11月13日 13:57
  • 1724

SQL Server 更改排序规则

最近因为测试环境 MSSQL 服务器排序规则区分大小写,导致实用到临时表(tempdb)的数据、临时对象都区分了大小写。所以重建了系统数据库并更改了排序规则,这里再次总结一下。 开始之前,先确认排...
  • kk185800961
  • kk185800961
  • 2017年05月26日 10:45
  • 1645
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正确设置与使用SQL Server的字符集(Collation,即排序规则)
举报原因:
原因补充:

(最多只允许输入30个字)