给我一点灵感:全角半角转换 想在sqlserver中写一个全角半角转换函数,却发现全角数字的ascii码都一样,有点麻烦了,各位,支点招 吧!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 全角数字的编码是两位的,例如:declare @s varchar(20)set @s = '1234567890'declare @b varbinary(20)set @b = cast(@s as varbinary)select @b--0xA3B1A3B2A3B3A3B4A3B5A3B6A3B7A3B8A3B9A3B0 全角数字的ascii码都一样 ???少取一位吧 dulei115() 已经说得很清楚了 declare @s nvarchar(10)set @s = '1234567890'declare @result varchar(10)set @result = ''while len(@s) > 0begin set @result = @result + char(unicode(@s) - unicode('0') + ascii('0')) set @s = right(@s, len(@s) - 1)endselect @result --'1234567890'注意:unicode('0')的结果不是oxA3B0而是0xFF10,因为这个函数是按照Unicode 标准来转换的 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编码排序 (此函数部分思路参考了CSDN上大力的转换函数)--邹建 2005.01(引用请保留此信息)--*//*--调用示例 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)ASBEGIN 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)ENDGO =================================== CSDN助手 全面支持CSDN论坛 == 监视、收藏、历史、签名走马灯 =================================== 最简单的做法是update table set field1=replace (field1,'6','6')如此将要转换的全角字符全部定义在替换的位置,直接一次全部换掉不过要查询指定的全角字符还是比较麻烦,不知是否有高手能做到感谢上面的高手指点 为什么调用函数前面要加dbo 权限? 查看sql联机帮助,拥有该用户定义函数的用户 ID 的名称。owner_name 必须是现有的用户 ID。 请问如果用SQL语句将SELECT出来的数据导入到指定的目录下的TXT文件里 这个SQL语句该怎么写? SQL server CLR部署问题 数据库(sql-server) sql语句问题。高分求教…… sql2005还原数据库提示错误为“媒体集有2个媒体簇,但是只提供了1个……” 谁说说使用联机帮助的经验,里面内容很多,应该按什么顺序看??? 再度请教全文索引 也许这个问题很无聊! 日期和时间查询的问题?急急急 关于树的排序,详情请进! 一个树型结构的问题
declare @s varchar(20)
set @s = '1234567890'
declare @b varbinary(20)
set @b = cast(@s as varbinary)
select @b--0xA3B1A3B2A3B3A3B4A3B5A3B6A3B7A3B8A3B9A3B0
set @s = '1234567890'
declare @result varchar(10)
set @result = ''
while len(@s) > 0
begin
set @result = @result + char(unicode(@s) - unicode('0') + ascii('0'))
set @s = right(@s, len(@s) - 1)
end
select @result --'1234567890'注意:
unicode('0')的结果不是oxA3B0而是0xFF10,因为这个函数是按照Unicode 标准来转换的
drop function [dbo].[f_convert]
GO/*--全角/半角转换转换说明
全角字符从的unicode编码从65281~65374
半角字符从的unicode编码从 33~126
空格比较特殊,全角为 12288,半角为 32
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
所以可以直接通过用+-法来处理非空格数据,对空格单独处理
like的时候,指定排序规则 COLLATE Latin1_General_BIN
是保证字符顺序按unicode编码排序
(此函数部分思路参考了CSDN上大力的转换函数)
--邹建 2005.01(引用请保留此信息)--*//*--调用示例 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
= CSDN助手 全面支持CSDN论坛 =
= 监视、收藏、历史、签名走马灯 =
==================================
update table set field1=replace (field1,'6','6')
如此将要转换的全角字符全部定义在替换的位置,直接一次全部换掉
不过要查询指定的全角字符还是比较麻烦,不知是否有高手能做到
感谢上面的高手指点