[日期:2005-07-08]來(lái)源:CSDN 作者:[字體:
大中小]
/*------------------------------------------------------------------------------------
/*歡迎轉載,請保留本聲明信息
/*作者:翁 彥
enhydraboy@yahoo.com.cn/*------------------------------------------------------------------------------------
這是一個(gè)在我實(shí)際一個(gè)項目中遇到的問(wèn)題。03BHL01001(上海)和03BHL01001(上海)比較的結果是一樣的。導致引起的重復的主鍵問(wèn)題。
03BHL01001(上海)和03BHL01001(上海)差別,就在于前者的括號是全角的括號字符,后者是半角的括號字符。全角的括號字符和半角的括號字符的ascii碼顯然是不一樣的。全角的( ASCII碼是0xA3A8 ,而半角的( 是0x28。那么為什么SQL Server會(huì )認為是一樣的呢?
問(wèn)題其實(shí)就出在數據庫的排序規則上,讓我們在仔細研讀一下SQL Server的文檔。SQL Server的排序規則由這樣幾部分組成,代碼頁(yè)、區分大小寫(xiě)、區分重音、區分寬度。最后一個(gè)在SQL Server的聯(lián)機幫助中沒(méi)有進(jìn)一步提及,其實(shí)本篇遇到的問(wèn)題就是由于這個(gè)原因造成的。區分寬度:指定 SQL Server 區分相同字符的單字節表示法(半角)和雙字節表示法(全角)。如果沒(méi)有選擇,則 SQL Server 將認為相同字符的單字節表示法和雙字節表示法等效。
缺省,安裝SQL Server中文版的時(shí)候,SQL Server幫你選擇的排序規則是Chinese_PRC_CI_AS(Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive),是中文,不區分大小寫(xiě)、區分重音、不區分假名、不區分寬度。因此,自然就認同03BHL01001(上海)=03BHL01001(上海)。
所以,正確的選擇應該是,后綴為WS的中文排序規則。本例中我們應該選擇Chinese_PRC_CI_AS_WS。
我們來(lái)看一下,指定排序規則是Chinese_PRC_CI_AS_WS后,怎么樣了?
select 1 where ‘03BHL01001(上海)‘=‘03BHL01001(上海)‘
collate Chinese_PRC_CI_AS_WS
-----------
(所影響的行數為 0 行)
看來(lái)這個(gè)問(wèn)題解決了。
重要提示:
如何察看使用那個(gè)排序規則呢?可以使用下面的SQL語(yǔ)句。
SELECT *
FROM ::fn_helpcollations()
可以查詢(xún)所有排序規則的信息。
查出所有中文排序規則的信息
SELECT * FROM
(
SELECT *
FROM ::fn_helpcollations()) A
WHERE name like ‘Chinese%‘
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。