【发布时间】:2016-06-07 20:00:21
【问题描述】:
版本:
Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
Apr 20 2015 17:29:27
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
服务器排序:
SQL_Latin1_General_CP1_CI_AS
Database(name: test) Collation(我从 SQL_Latin1_General_CP1_CI_AS 修改为 Japanese_CI_AS)
Japanese_CI_AS
测试表(假设只有一列表名为 t_test):
name varchar(255)
我的问题:
在我修改测试数据库排序规则之前(现在是 SQL_Latin1_General_CP1_CI_AS ),如果我在 sql 下面执行:
insert into t_test(name) values('り');
结果是那个名字保存为'?',我理解这个行为者。
在我修改了测试数据库排序规则后(现在是 Japanese_CI_AS),如果我执行下面的 sql:
insert into t_test(name) values('り');
结果还是那个名字保存为'?',不知道为什么?
有人知道吗?我必须使用 varchar 类型,因为这是第三方数据库,我无法修改它。如何解决?
db Collation 是否必须与 Server Collation 相同?
Server Collation 为 Japanese_CI_AS 时,我可以成功插入任何日文。
Case 1:
1. select serverproperty('collation');
SQL_Latin1_General_CP1_CI_AS
2. use master;
3. select databasepropertyex('test_db','collation');
SQL_Latin1_General_CP1_CI_AS
4. use test_db;
5. CREATE TABLE t_test(name VARCHAR(128) COLLATE SQL_Latin1_General_CP1_CI_AS);
insert into t_test(name) values('り');
insert into t_test(name) values(N'り');
SELECT * FROM t_test;
DROP table t_test;
?
?
Case 2:
1. select serverproperty('collation');
SQL_Latin1_General_CP1_CI_AS
2. use master;
3. select databasepropertyex('test_db','collation');
SQL_Latin1_General_CP1_CI_AS
4. use test_db
4. CREATE TABLE t_test(name VARCHAR(128) COLLATE Japanese_CI_AS);
insert into t_test(name) values('り');
insert into t_test(name) values(N'り');
SELECT * FROM t_test;
DROP table t_test;
?
り
Case 3:
1. select serverproperty('collation');
SQL_Latin1_General_CP1_CI_AS
2. use master;
2. alter database test_db collate Japanese_CI_AS;
3. select databasepropertyex('test_db','collation');
SQL_Latin1_General_CP1_CI_AS
4. use test_db;
5. select databasepropertyex('test_db','collation');
Japanese_CI_AS
6. CREATE TABLE t_test(name VARCHAR(128) COLLATE Japanese_CI_AS);
insert into t_test(name) values('り');
insert into t_test(name) values(N'り');
SELECT * FROM t_test;
DROP table t_test;
り
り
以上三种情况如何工作?
【问题讨论】:
-
您需要使用
NVARCHAR类型并插入类似insert into t_test(name) values(N'り');的语句(N 表示宽字符串)。 -
You do know that collation is a property of each column?数据库排序规则只是新列的默认值。 (即要更改现有数据库中的排序规则,您必须更改每一列的排序规则) -
@adrianm 是的,我明白了。现在,您知道 CASE 2 的工作原理了吗?
标签: sql-server collation codepages