2010-11-10 66 views
5

我正在使用Sql Server 2008 R2 Enterprise。我正在編寫一個能夠從Sql表插入,更新,刪除和選擇記錄的應用程序。當涉及到包含特殊字符(例如ć,č,đ和ž)的記錄時,該應用程序出錯。Sql表中的Unicode字符

這裏發生了什麼:

命令:

INSERT INTO Account (Name, Person) 
VALUES ('Boris Borenović', 'True') 
WHERE Id = '1' 

插入一個新的記錄,但在名稱字段是Boris Borenovic,所以性格ć更改爲c

命令:

SELECT * FROM Account 
WHERE Name = 'Boris Borenović' 

返回正確的記錄,如此反覆字符ćc更換並返回該記錄。

問題:

  1. 是否有可能使SQL Server保存ć特殊字符前面提到的?
  2. 如果解決了上一個問題,是否仍有可能使Sql能夠返回Boris Borenović記錄,即使查詢請求的是Boris Borenovic

所以,保存記錄時,我希望SQL救到底是什麼給出,但是檢索記錄時,我希望它能夠ingnore的特殊字符。感謝所有的幫助。

回答

12

1)確保該列是類型爲nvarchar而不是爲varchar(或NCHAR對於char)

2)在包含這樣的字符串字符串常量,例如開始使用N'N'Boris Borenović'

3)如果您使用的是客戶端庫(如ADO.Net),它應該處理Unicode文本,只要再次,參數標記爲nvarchar的/ NCHAR,而不是爲varchar /炭

4)如果你想查詢和忽略重音,那麼你可以添加一個COLLATE子句到你的選擇。例如: -

SELECT * FROM Account 
WHERE Name = 'Boris Borenovic' COLLATE Latin1_General_CI_AI 

凡_CI_AI指不區分大小寫,不區分重音,應與「C」結尾的所有變體返回所有行。 5)如果表中的列是UNIQUE/PK約束的一部分,並且你需要它包含「BorisBorenović」和「Boris Borenovic」,那麼在列定義中添加一個COLLATE子句,但是這個時間在最後使用「_AS」的歸類,這表示它對區分重音敏感。

+0

謝謝你的回答。我的Sql表中的字段Name是nvarchar(50)類型,所以問題保持不變。 至於整理,我認爲應該解決第二個問題,但是,直到我解決'ć'和其他缺失的字符,我卡住了。我在代碼中檢查了我的Sql命令文本,它看起來很正常(意思是它包含那些討厭的字符)。難道還有其他的東西阻止了這些角色的保存嗎?爲什麼SELECT語句也將'ć'轉換爲'c'(我沒有使用COLLATE)? – Boris 2010-11-10 15:28:50

+0

@Boris - 就像我說的(點2),如果你有字符串文字(如你已經發布的例子),你需要在開頭引號之前加一個「N」,否則字符串會被轉換在進入表格之前轉換成另一種形式。 – 2010-11-10 15:46:29

+0

好吧,我明白了!我應該把這個'N'放在每個字段值的前面嗎? – Boris 2010-11-10 15:58:35

1

要允許SQL Server存儲特殊字符,請使用nvarchar而不是varchar作爲列類型。

檢索時,可以強制口音鈍感整理,以便它忽略了不同的C的:

WHERE Name = 'Boris Borenović' COLLATE Cyrillic_General_CI_AI 

這裏,CI表示不區分大小寫,並作爲不區分重音。