--在创建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
/*
注意:
这里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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
连接查询上述临时表的内容时,将出现如下报错信息:
--查询报错
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" 之间的排序规则冲突。
--方式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
-------------------------------------------------------
1
2
3
4
5
6
7
第二种解决方法则是在创建表时指定列的排序规则
--方式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
-------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
同时instances的排序规则设置会影响SQL Server数据的导入导出功能。
通常我们遇到的另一个问题是:通过SSMS(即SQL Server Management Studio)插入(insert)的中文,在查询时显示乱码(即问号?)。
--在上述表collation_test插入中文
INSERT INTO collation_test VALUES ('东')
--查询表collation_test的记录
select * from collation_test