哪些字符是有全角和半角之分的?
首先,中文是只有全角,没有半角之分,所以转换的时候可以忽略掉中文字符。
select UNICODE('a'),UNICODE('a'),UNICODE('a')-UNICODE('a') ---97| 265345| 65248在ASCII码中,英文字符与标点的编码范围为33~126,用SQL 通配符表示为:
[!-~]
,当然,全角字符的编码是超出ASCII编码范围的,只需在半角的ASCII的编码基础加上差值65248
就能得到全角的UNICODE编码。
了解了半角和全角的关系之后可以写个函数来相互转换
1 CREATE FUNCTION fn_Convert( 2 @str NVARCHAR(4000), --要转换的字符串 3 @flag BIT --转换标志,0转换成半角,1转换成全角 4 ) 5 RETURNS NVARCHAR(4000) 6 AS 7 BEGIN 8 DECLARE 9 @pat NVARCHAR(8), 10 @step INT, 11 @i INT, 12 @spc INT 13 14 IF @flag = 0 15 SELECT 16 @pat = N'%[!-~]%', --全角的通配符 17 @step = -65248, 18 @str = REPLACE(@str, N' ', N' ') 19 ELSE 20 SELECT 21 @pat = N'%[!-~]%', --半角的通配符 22 @step = 65248, 23 @str = REPLACE(@str, N' ', N' ') 24 --指定排序规则 25 SET @i = PATINDEX(@pat collate LATIN1_GENERAL_BIN, @str) 26 WHILE @i > 0 27 SELECT 28 @str = REPLACE(@str, 29 SUBSTRING(@str, @i, 1), 30 NCHAR(UNICODE(SUBSTRING(@str, @i, 1)) + @step)), 31 @i = PATINDEX(@pat collate LATIN1_GENERAL_BIN, @str) 32 RETURN (@str) 33 END
标签:pat,str,全角,半角,Server,--,UNICODE,SQL From: https://www.cnblogs.com/lgx5/p/17159600.html