程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 數據庫使用技巧:SQL全角與半角切換

數據庫使用技巧:SQL全角與半角切換

編輯:關於SqlServer


數據庫系統中,經常有些用戶在輸入數據的時候會不小心使用全角輸入,這就有可能會導致我們的程序出錯,如何解決此類問題了。

測試代碼:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved