數據庫系統中,經常有些用戶在輸入數據的時候會不小心使用全角輸入,這就有可能會導致我們的程序出錯,如何解決此類問題了。
測試代碼:
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