【问题标题】:Sqlserver database Collation is not workingSqlserver 数据库排序规则不起作用
【发布时间】: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) Collat​​ion(我从 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 Collat​​ion 是否必须与 Server 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;

    り
    り

以上三种情况如何工作?

【问题讨论】:

  • 您需要使用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


【解决方案1】:

终于找到答案了:

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

  1. 指定一个 Unicode 常量。

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

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

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多