熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

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

2013-11-15 14:38:41  來源: SQL Server 

  這是一個實際一個項目中遇到的問題BHL(上海)和BHL(上海)比較的結果是一樣的導致引起的重復的主鍵問題
  
  BHL(上海)和BHL(上海)差別就在於前者的括號是全角的括號字符後者是半角的括號字符全角的括號字符和半角的括號字符的ascii碼顯然是不一樣的全角的( ASCII碼是xAA 而半角的( 是x那麼為什麼SQL Server會認為是一樣的呢?
  
  問題其實就出在數據庫的排序規則上讓我們在仔細研讀一下SQL Server的文檔SQL Server的排序規則由這樣幾部分組成代碼頁區分大小寫區分重音區分寬度最後一個在SQL Server的聯機幫助中沒有進一步提及其實本篇遇到的問題就是由於這個原因造成的區分寬度指定 SQL Server 區分相同字符的單字節表示法(半角)和雙字節表示法(全角)如果沒有選擇則 SQL Server 將認為相同字符的單字節表示法和雙字節表示法等效
  
  缺省安裝SQL Server中文版的時候SQL Server幫你選擇的排序規則是Chinese_PRC_CI_AS(ChinesePRC caseinsensitive accentsensitive kanatypeinsensitive widthinsensitive)是中文不區分大小寫區分重音不區分假名不區分寬度因此自然就認同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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.