理解SQLSERVER中的排序規則

有朋友在論壇發帖描述這樣一個現象:
        通過SSMS向SQL Server 2005中插入中文數據後,查詢出來的結果是???,根本就不顯示中文。用圖形化和Insert語句後結果也是一樣,使用查詢分析器操作,情況也是如此。

  在排除了錄入有誤的情況外,剩下可以解釋的就是朋友在SQLSERVER設置的排序規則有問題了。朋友在SQLSEVER2005中使用的排序規則是SQL_Latin1_General_CP1_CI_AS,而不是可以正確顯示簡體漢字的三種排序規則:
Chinese_PRC_BIN,
Chinese_PRC_CI_AS,
Chinese_PRC_CS_AS。
  讓朋友在將SQLSERVER2005對應數據庫中將排序規則改成Chinese_PRC_CI_AS,問題解決。

  看看MS對排序規則的解釋:排序規則控制 SQL Server 2005 中的字符串物理存儲。排  序規則指定表示每個字符的位模式以及存儲和比較字符使用的規則。
       也就是說,在SQLSERVER中,排序規則實際上就是字符編碼。(真不明白MS爲什麼又搞出個排序規則這個詞?)

       在查詢分析器內執行下面語句,可以得到SQL SERVER支持的所有排序規則。
    select * from ::fn_helpcollations() 
        排序規則名稱由兩部份構成,前半部份是指本排序規則所支持的字符集。
        如:Chinese_PRC_CS_AI_WS
        前半部份:指UNICODE字符集,Chinese_PRC_指針對大陸簡體字UNICODE的排序規則。
        排序規則的後半部份即後綴含義:
      _BIN 二進制排序
      _CI(CS) 是否區分大小寫,CI不區分,CS區分
      _AI(AS) 是否區分重音,AI不區分,AS區分   
      _KI(KS) 是否區分假名類型,KI不區分,KS區分 
            _WI(WS) 是否區分寬度 WI不區分,WS區分 
         區分大小寫:如果想讓比較將大寫字母和小寫字母視爲不等,請選擇該選項。
         區分重音:如果想讓比較將重音和非重音字母視爲不等,請選擇該選項。如果選擇該選項,比較還將重音不同的字母視爲不等。
         區分假名:如果想讓比較將片假名和平假名日語音節視爲不等,請選擇該選項。
         區分寬度:如果想讓比較將半角字符和全角字符視爲不等,請選擇該選項.

 
理解了SQLSERVER中的排序規則後,對於上述問題,可以得出以下結論:
  一:修改SQLSERVER用戶數據庫爲支持中文字符集的排序規則。
  二:對於存在漢字顯示??,同時又不想更改數據庫上的排序規則,又想要正確顯示出漢字的話,建議在設計時全部使用Unicode類型字段,也就是那些以N開頭的字段類型,比如nChar,nVarchar,纔可以正確顯示漢字。
  三:如果不想更改排序規則,又不想更改字段類型,那麼就要更改SQL語句,對於所有的漢字,前面也要加上N纔可以正確顯示。具體的方法請參考下面兩條語句:
   查詢:select * from tb_Cust where FirstName=N'汪'
   插入:insert tb_Cust(FirstName,LastName,Sex) values(N'汪',N'鑫昊',N'男')
 
注:對於SQLSERVER2000以後,修改服務器級別的排序規則會比較麻煩,需要重建Master數據庫,爲安全以見,不建議直接修改服務器級別的排序規則!

本文出自 “我兒子真帥!” 博客,請務必保留此出處http://alligator.blog.51cto.com/36993/79970

發佈了38 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章