注冊會員,創建你的web開發資料庫,
/* written by enydraboy ,2003-07-17 */
/*發表于csdn */
/* 轉載請注明出處和保留此版權信息 */
在csdn的專家論壇中,看到有一位朋友問起關于“由于從其它數據庫中導入的數據存在半個漢字的問題,所以希望能在查詢語句中將這半個漢字處理掉,怎么處理都行。望各位高手不吝賜教!”的問題,啟初有點意外,但是后來覺得從這個問題可以帶出一些sql server漢字中存儲和處理的方法,覺得有必要總結一下。
漢字是由兩個字節存儲的,每個字節的數值都>127。所以上面的問題的解決方案就是:把字符串按字節順序截取,當出現第一個字節是>127,但是后面一個字節是<127的這種情況,就丟棄掉。
接下來,我們要明確些技術細節:
(1) 在sql server中有很多字符串相關的操作函數,但是直接去操作包含了漢字的字符串,會有點問題。說明如下:len計算長度的時候,會把漢字和英文字符都看成長度一樣的;substring也是這樣,ascii是返回第一個字節的ascii 碼。
example:
select len('你好a'),substring('你好a',1,1),ascii('你')
結果是
                             
-----------       ---- -       ---------- 
3           你          196
一定要把字符串要轉換成varbinary來處理,才可以。
 
(2) sql server中,如何把ascii碼組合成漢字,就是把高字節和底字節分別轉成字符再拼接起來。如char(210)+char(166)就是姚這個漢字。
再明確了上面的技術細節后,接下來就可以解決問題了。我通過編寫一個函數來解決問題。
create function fn_truncsemihanzi(@str varchar(4000))
returns  varchar(8000)
as
begin
declare
@stmp varchar(8000),@i int,@itmp int,@itmp2 int ,@stmp2 varchar(2) 
select @stmp=''
  select @i=1
  while @i<=len(@str)
  begin
     select @itmp=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),1,1)) --截取一個字節
    if @itmp>127  
    begin
      --大于127檢查后面一個字節
select @itmp2=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),2,1))
       if @itmp2>127 
      begin
        select @stmp2=char(@itmp)+char(@itmp2)   --是一個完整的漢字 
     end 
     else
     begin
        select @stmp2=char(@itmp2)   --丟棄半個漢字
    end
  end
  else
  begin
      select @stmp2=char(@itmp)
  end 
   select @[email protected][email protected] 
   select @[email protected]+1
  end
   return @stmp
end
測試如下:
declare @str varchar(4000)
-- 設置參數值
-- 設置參數值
--帶有半個漢字,是你這個漢字的前面一部分
select @str='b'+char(convert(int,substring(convert(varbinary,'你'),1,1)))+'a你'
select @str  帶有半個漢字,dbo.fn_truncsemihanzi(@str) 去掉半個漢字
 
帶有半個漢字   長度    去掉半個漢字   長度          
------------------ ----------- --------------- -------------------
b腶你          3      ba你             3
 
我們還可以發現這樣一個有趣的現象,由于我是截了半個漢字出來,結果你的前半個漢字的字符和后面一個英文字母a 組合,成了一個怪怪的字符腶。
總結,通過這個問題的解決,大家可以了解漢字在sql server2000中存儲和處理的基本方法,像如何區分一個字符串中是否包含了漢字,和分離字符串中中文和英文都可以套用本文中方法。
本文中測試的環境是win2000 server(中文)+sql server 2000(中文),英文環境下沒有測試,如有問題,歡迎大家指正。