數據庫系統中,經常有些用戶在輸入數據的時候會不小心使用全角輸入,這就有可能會導致我們的程序出錯,如何解決此類問題了。
測試代碼:
select cast('111' as int) as num1
select cast('111' as int) as num2
運行結果:
第一個正確顯示: 111
第二個則報錯: 在將 varchar 值 '111' 轉換成數據類型 int 時失敗。
下面使用自定義標量函數來解決這個問題:
if object_id(N'u_convert',N'FN') is not null drop function u_convert GO
轉換原理
全角字符unicode編碼從65281~65374
半角字符unicode編碼從33~126
空格比較特殊,全角為 12288,半角為 32
而且除空格外,全角/半角按unicode編碼排序在順序上是對應的
所以可以直接通過用+-法來處理非空格數據,對空格單獨處理
like的時候,指定排序規則 COLLATE Latin1_General_BIN
是保證字符順序按unicode編碼排序
*/ create function u_convert( @str nvarchar(4000), --要轉換的字符串 @flag bit --轉換標志,0轉換成半角,1轉換成全角 ) returns nvarchar(4000) AS begin declare @pat nvarchar(8), @step int, @i int, @spc int if @flag=0 begin select @pat=N'%[!-~]%',@step=-65248, @str=replace(@str,N' ',N' ') end else begin select @pat=N'%[!-~]%',@step=65248, @str=replace(@str,N' ',N' ') end set @i=patindex(@pat collate LATIN1_GENERAL_BIN,@str) while @i>0 select @str=replace(@str, substring( @str,@i,1), nchar(unicode(substring(@str,@i,1))+@step)), @i=patindex(@pat collate LATIN1_GENERAL_BIN,@str) return(@str) end GO
測試語句:
關鍵詞: