這是一個實際一個項目中遇到的問題
BHL
(上海)和
BHL
(上海)比較的結果是一樣的
導致引起的重復的主鍵問題
BHL
(上海)和
BHL
(上海)差別
就在於前者的括號是全角的括號字符
後者是半角的括號字符
全角的括號字符和半角的括號字符的ascii碼顯然是不一樣的
全角的( ASCII碼是
xA
A
而半角的( 是
x
那麼為什麼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)
是中文
不區分大小寫
區分重音
不區分假名
不區分寬度
因此
自然就認同
BHL
(上海)=
BHL
(上海)
所以
正確的選擇應該是
後綴為WS的中文排序規則
本例中我們應該選擇Chinese_PRC_CI_AS_WS
我們來看一下
指定排序規則是Chinese_PRC_CI_AS_WS後
怎麼樣了?
select
where
BHL
(上海)
=
BHL
(上海)
collate Chinese_PRC_CI_AS_WS
(所影響的行數為
行)
看來這個問題解決了
重要提示
如何察看使用那個排序規則呢?可以使用下面的SQL語句
SELECT *
FROM ::fn_helpcollations()
可以查詢所有排序規則的信息
查出所有中文排序規則的信息
SELECT * FROM
(
SELECT *
FROM ::fn_helpcollations()) A
WHERE name like
Chinese%
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22110.html