Sqlserver数据库排序规则不起作用

时间:2016-02-25 07:10:35

标签: sql-server collation codepages

版本:

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

数据库(名称:test)排序规则(我将其从SQL_Latin1_General_CP1_CI_AS修改为Japanese_CI_AS)

Japanese_CI_AS

测试表(假设只有一个表名为t_test的列):

name varchar(255)

我的问题:

在我修改测试db Collat​​ion之前(现在它是SQL_Latin1_General_CP1_CI_AS),如果我在sql下面执行:

insert into t_test(name) values('り');

结果是名称保存为'?',我理解这个行为。

我修改了测试db Collat​​ion(现在是Japanese_CI_AS)后,如果我在sql下面执行:

insert into t_test(name) values('り');

结果是该名称仍然保存为'?',我不知道为什么?

有人知道吗?我必须使用varchar类型,因为这是第三方数据库,我无法修改它。如何解决?

db Collat​​ion是否必须与Server Collat​​ion相同?

当服务器排序规则是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;

    り
    り

以上三种情况如何运作?

1 个答案:

答案 0 :(得分:1)

最后,我找到了答案:

如果您创建的表格的文本列的代码页与数据库的默认排序规则的代码页不同,则只有两种方法可以指定要插入到列中的数据值,或者更新现有值。你可以:

  1. 指定Unicode常量。

  2. 从具有相同代码页的其他列中选择一个值。

  3. https://technet.microsoft.com/en-us/library/aa214897%28v=sql.80%29.aspx