Sqlserver 数据库排序规则不起作用
Sqlserver database Collation is not working
版本:
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
测试 Table(假设只有一列名称为 table t_test):
name varchar(255)
我的问题:
在我修改测试数据库排序规则之前(现在是 SQL_Latin1_General_CP1_CI_AS ),如果我在下面执行 sql:
insert into t_test(name) values('り');
结果那个名字存为'?',我理解这个行为
我修改了test db Collation后(现在是Japanese_CI_AS),如果我执行下面sql:
insert into t_test(name) values('り');
结果那个名字还是保存为'?',我不知道为什么?
有人知道吗?我必须使用varchar类型,因为这是第三方数据库,我不能修改它。如何解决?
数据库排序规则是否必须与服务器排序规则相同?
当服务器排序规则为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;
り
り
以上三种情况是如何工作的?
终于找到答案了:
如果您创建一个 table,其文本列的代码页与数据库默认排序规则的代码页不同,则只有两种方法可以指定要插入该列的数据值,或更新现有值。您可以:
指定一个 Unicode 常量。
Select 来自具有相同代码页的另一列的值。
https://technet.microsoft.com/en-us/library/aa214897%28v=sql.80%29.aspx
版本:
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
测试 Table(假设只有一列名称为 table t_test):
name varchar(255)
我的问题:
在我修改测试数据库排序规则之前(现在是 SQL_Latin1_General_CP1_CI_AS ),如果我在下面执行 sql:
insert into t_test(name) values('り');
结果那个名字存为'?',我理解这个行为
我修改了test db Collation后(现在是Japanese_CI_AS),如果我执行下面sql:
insert into t_test(name) values('り');
结果那个名字还是保存为'?',我不知道为什么?
有人知道吗?我必须使用varchar类型,因为这是第三方数据库,我不能修改它。如何解决?
数据库排序规则是否必须与服务器排序规则相同?
当服务器排序规则为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;
り
り
以上三种情况是如何工作的?
终于找到答案了:
如果您创建一个 table,其文本列的代码页与数据库默认排序规则的代码页不同,则只有两种方法可以指定要插入该列的数据值,或更新现有值。您可以:
指定一个 Unicode 常量。
Select 来自具有相同代码页的另一列的值。
https://technet.microsoft.com/en-us/library/aa214897%28v=sql.80%29.aspx