SQL Server中全角和半角字符的比較問題

這是一個在我實際一個項目中遇到的問題。03BHL01001(上海)和03BHL01001(上海)比較的結果是一樣的。導致引起的重複的主鍵問題。

php學習之家

 

03BHL01001(上海)和03BHL01001(上海)差別,就在於前者的括號是全角的括號字符,後者是半角的括號字符。全角的括號字符和半角的括號字符的ascii碼顯然是不一樣的。全角的( ASCII碼是0xA3A8 ,而半角的( 是0x28。那麼爲什麼SQL Server會認爲是一樣的呢? php學習之家http://www.444p.com

問題其實就出在數據庫的排序規則上,讓我們在仔細研讀一下SQL Server的文檔。SQL Server的排序規則由這樣幾部分組成,代碼頁、區分大小寫、區分重音、區分寬度。最後一個在SQL Server的聯機幫助中沒有進一步提及,其實本篇遇到的問題就是由於這個原因造成的。區分寬度:指定 SQL Server 區分相同字符的單字節表示法(半角)和雙字節表示法(全角)。如果沒有選擇,則 SQL Server 將認爲相同字符的單字節表示法和雙字節表示法等效。 php學習之家http://www.444p.com

缺省,安裝SQL Server中文版的時候,SQL Server幫你選擇的排序規則是Chinese_PRC_CI_AS(Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive),是中文,不區分大小寫、區分重音、不區分假名、不區分寬度。因此,自然就認同03BHL01001(上海)=03BHL01001(上海)。 php學習之家

所以,正確的選擇應該是,後綴爲WS的中文排序規則。本例中我們應該選擇Chinese_PRC_CI_AS_WS。 www.444p.com

我們來看一下,指定排序規則是Chinese_PRC_CI_AS_WS後,怎麼樣了?

php學習之家http://www.444p.com

 

 

php學習之家http://www.444p.com

 

select 1 where '03BHL01001(上海)'='03BHL01001(上海)' php學習之家

collate Chinese_PRC_CI_AS_WS

www.444p.com版權所有

 

(所影響的行數爲 0 行)

www.444p.com版權所有

 

看來這個問題解決了。

www.444p.com

 

重要提示:

www.444p.com版權所有

 

如何察看使用那個排序規則呢?可以使用下面的SQL語句。

www.444p.com

 

SELECT *

php學習之家http://www.444p.com

 

FROM ::fn_helpcollations() php學習之家http://www.444p.com

可以查詢所有排序規則的信息。

本文來自 www.444p.com

 

查出所有中文排序規則的信息 php學習之家

SELECT * FROM (

 

SELECT *

 

FROM ::fn_helpcollations()) A

php學習之家http://www.444p.com

 

WHERE name like 'Chinese%'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章