Sql server Sqlserver数据库排序规则不工作

Sql server Sqlserver数据库排序规则不工作,sql-server,collation,codepages,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) 数据库(名称:test)排序规则(我将其从SQL\u-Latin1\u-General\u-CP1\u-CI\u-

版本:

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)
数据库(名称:test)排序规则(我将其从SQL\u-Latin1\u-General\u-CP1\u-CI\u-AS修改为Japanese\u-CI\u-AS)

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

我的问题:

在我修改测试数据库排序规则(现在是SQL\u拉丁1\u通用\u CP1\u CI\u AS)之前,如果我执行以下SQL:

insert into t_test(name) values('り');
insert into t_test(name) values('り');
结果是名称保存为“?”,我理解这种行为

在我修改了测试数据库排序规则(现在它是日语的)之后,如果我执行以下sql:

insert into t_test(name) values('り');
insert into t_test(name) values('り');
结果是这个名字仍然保存为“?”,我不知道为什么

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

数据库排序规则是否必须与服务器排序规则相同

当服务器排序规则为日语时,我可以插入任何成功的日语

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;

    り
    り

以上三种情况如何运作?

最后,我找到了答案:

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

  • 指定一个Unicode常量

  • 从具有相同代码页的另一列中选择一个值


  • 您需要使用
    NVARCHAR
    键入并插入语句,如
    insert-into-t\u-test(name)值(N'り');
    (N表示宽字符串)。
    您知道排序规则是每列的属性吗?
    数据库排序规则只是新列的默认值。(即,要更改现有数据库中的排序规则,您必须更改每列的排序规则)@adrianm是的,我知道了。现在,您知道案例2是如何工作的吗?
    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;
    
        り
        り