2016-02-25 27 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