注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 IB客座主编(四)美国西蒙公..
 帮助

SQLSERVER中的全角和半角


2006-01-19 23:08:28
 标签:SQL   [推送到技术圈]

全角字符和半角字符都能通过SQL SERVER的条件判断。
例如:
select * from t_xtgl_user where user_code = 'lyy'   (半角)
select * from t_xtgl_user where user_code = 'lyy' (全角)

上面两个话都能查到user_code为'LYY'的用户信息。
而全角字符记载入数据库后,对程序后面的字符判断和比较容易产生混乱,特别是与其它数据库交叉混用,造成意向不到的麻烦。

对于这种情况,我们可以采取两种方式:
1、禁止使用全角,当用户使用全角字符时,提示用户输入非法字符(全角),提示用户重新输入。
2、允许使用全角,当用户使用全角字符时,系统自动将其转化为半角字符。
当然第二种办法是比较好的,提供用户最大的可操作性。




    文章评论
 
2008-04-22 11:20:58
可以加参数collate Chinese_PRC_CS_AS_WS判断全角还是半角
select * from t_xtgl_user where user_code collate Chinese_PRC_CS_AS_WS = 'lyy'   (区别全角半角)
select * from t_xtgl_user where user_code collate Chinese_PRC_CI_AS_WS = 'lyy' (不做区别)

2008-04-22 11:22:21
转:Sqlserver 全角/半角转换
------------------------------
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[f_convert]')   and   xtype   in   (N'FN',   N'IF',   N'TF'))  
drop   function   [dbo].[f_convert]  
GO  
 
/*--全角/半角转换  
 
转换说明  
全角字符从的unicode编码从65281~65374  
半角字符从的unicode编码从     33~126  
空格比较特殊,全角为   12288,半角为   32  
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的  
所以可以直接通过用+-法来处理非空格数据,对空格单独处理  
like的时候,指定排序规则   COLLATE   Latin1_General_BIN  
是保证字符顺序按unicode编码排序  

 
declare   @s1   varchar(8000)  
select   @s1='中    2-3456a78STUVabn中国opwxyz'  
select   dbo.f_convert(@s1,0),dbo.f_convert(@s1,1)  
*/  
Create   FUNCTION   f_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  
Select   @pat=N'%[!-~]%',@step=-65248,  
@str=REPLACE(@str,N' ',N'   ')  
ELSE  
Select   @pat=N'%[!-~]%',@step=65248,  
@str=REPLACE(@str,N'   ',N' ')  
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  

declare   @s1   varchar(8000)  
select   @s1='中    2-3456a78STUVabn中国opwxyz'
select   dbo.f_convert(@s1,0),dbo.f_convert(@s1,1)


 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: