/*------------------------------------------------------------------------------------
/*歡迎轉載,請保留本聲明資訊
/*作者:翁 彥 enhydraboy@yahoo.com.cn
/*------------------------------------------------------------------------------------
這是一個在我實際一個項目中遇到的問題。03BHL01001(上海)和03BHL01001(上海)比較的結果是一樣的。導致引起的重複的主鍵問題。
03BHL01001(上海)和03BHL01001(上海)差別,就在於前者的括弧是全形的括弧字元,後者是半形的括弧字元。全形的括弧字元和半形的括弧字元的ascii碼顯然是不一樣的。全形的( ASCII碼是0xA3A8 ,而半形的( 是0x28。那麼為什麼SQL Server會認為是一樣的呢?
問題其實就出在資料庫的定序上,讓我們在仔細研讀一下SQL Server的文檔。SQL Server的定序由這樣幾部分組成,字碼頁、區分大小寫、區分重音、區分寬度。最後一個在SQL Server的線上說明中沒有進一步提及,其實本篇遇到的問題就是由於這個原因造成的。區分寬度:指定 SQL Server 區分相同字元的單位元組標記法(半形)和雙位元組標記法(全形)。如果沒有選擇,則 SQL Server 將認為相同字元的單位元組標記法和雙位元組標記法等效。
預設,安裝SQL Server中文版的時候,SQL Server幫你選擇的定序是Chinese_PRC_CI_AS(Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive),是中文,不區分大小寫、區分重音、不區分假名、不區分寬度。因此,自然就認同03BHL01001(上海)=03BHL01001(上海)。
所以,正確的選擇應該是,尾碼為WS的中文定序。本例中我們應該選擇Chinese_PRC_CI_AS_WS。
我們來看一下,指定定序是Chinese_PRC_CI_AS_WS後,怎麼樣了?
select 1 where '03BHL01001(上海)'='03BHL01001(上海)' collate Chinese_PRC_CI_AS_WS ----------- (所影響的行數為 0 行) |
看來這個問題解決了。
重要提示:
如何察看使用那個定序呢?可以使用下面的SQL語句。
SELECT *
FROM ::fn_helpcollations()
可以查詢所有定序的資訊。
查出所有中文定序的資訊
SELECT * FROM ( SELECT * FROM ::fn_helpcollations()) A WHERE name like 'Chinese%' |