2013-05-17 70 views
0

[THIS IS 不是一個關於產品:NVARCHAR或如何存儲漢字]SQL Server字符集和N前綴

SQL Server 2008 Express的

數據庫歸類爲SQL_Latin1_General_CP1_CI_AS

create table sample1(val varchar(2)) 
insert into sample1 values(N'中文') 
  1. 我知道這些漢字會變成垃圾角色。
  2. 我知道我可以使用nvarchar來克服所有問題。

我不知道的是:爲什麼在運行插入語句時沒有「字符串太長」的錯誤?

  1. N前綴表示客戶端將使用UNICODE對字符串進行編碼。
  2. 2漢字將變爲4個字節。
  3. varchar(2)只能包含2個字節。

爲什麼人們投下這個問題?真?

+7

那麼,SQL Server發現你插入到'varchar'列中,​​因此它會**自動**將你傳入的字符串轉換爲非Unicode,varchar'兼容的兩個字符串。兩個字符對於此列來說不太大。 –

+0

首先,varchar不能直接存儲這些字符,它會轉換它們,所以通常我們使用nvarchar。你可以試試這個create table sample3(val nvarchar(2)) insert into sample3 values(N'中文') –

+0

我知道這不是關於存儲中文的問題。就像我告訴過你的那樣,一個隱含的投射會發生並將它存儲在你的varchar中作爲「??」 (至少在我的代碼頁上) – Paul

回答

1

更多解釋@marc_s答案。

字符N'中文'將被轉換爲varchar,並且排序規則爲SQL_Latin1_General_CP1_CI_AS。由於代碼頁中沒有這樣的字符,它會轉換爲未定義的,最後是0x3f3f0x3f是問號,所以在這種情況下將會有兩個問號,並且它不會超過列長度。

0

嘗試使用NVARCHAR(...),NCHAR(...)數據類型 -

CREATE TABLE dbo.sample1 
(
    val NVARCHAR(4) 
) 
INSERT INTO dbo.sample1 
SELECT N'中文' 
2

一個隱含的投發生。如果「val」被創建爲nvarchar(2),這將工作。

相關問題