2016-02-25 28 views
1

版本:SQLServer数据库整理工作不

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) 

Server排序:

SQL_Latin1_General_CP1_CI_AS 

数据库(名称:检验)核对(我修改了它从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类型,因为这是第三方数据库,我无法修改它。如何解决它?

数据库归类必须与服务器归类一样吗?

当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

您需要使用'NVARCHAR'型和插入语句一样'插入t_test(名称)的值(N 'り');'(N为宽字符字符串)。 –

+0

我必须使用varchar – Tony

+0

'您知道排序规则是每列的属性吗?'数据库排序规则只是新列的默认值。 (即要更改现有数据库中的排序规则,则必须更改每列的排序规则) – adrianm

回答

1

最后,我找到了答案:

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

  1. 指定Unicode常量。

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

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