如何在SQL Server中实现Oracle的TO_MULTI_BYTE()单字节转多字节功能?
在SQL Server中实现半角转全角(类似Oracle的TO_MULTI_BYTE函数)
嘿,这个问题我之前帮不少人解决过——确实SQL Server不像Oracle那样自带TO_MULTI_BYTE函数来做半角转全角,但咱们完全可以自己写一个自定义函数来实现这个需求,而且逻辑其实挺清晰的。
核心原理:半角与全角的字符编码对应
半角可打印字符(从空格 到波浪线~,ASCII码范围32-126)对应的全角字符,有一个固定的偏移量:全角字符的Unicode码 = 半角字符的ASCII码 + 65248。比如半角b(ASCII 98)加上65248就是65346,对应全角b;半角空格(ASCII 32)加65248得到12288,就是全角空格 。
自定义函数实现
下面是一个通用的自定义函数,它会遍历输入字符串的每个字符,判断是否为半角字符,是则转换为全角,否则保留原字符:
CREATE FUNCTION dbo.TO_MULTI_BYTE ( @input NVARCHAR(MAX) ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @result NVARCHAR(MAX) = '' DECLARE @currentChar NCHAR(1) DECLARE @i INT = 1 WHILE @i <= LEN(@input) BEGIN SET @currentChar = SUBSTRING(@input, @i, 1) -- 判断是否为半角可打印字符(ASCII 32-126) IF UNICODE(@currentChar) BETWEEN 32 AND 126 BEGIN SET @result = @result + NCHAR(UNICODE(@currentChar) + 65248) END ELSE BEGIN SET @result = @result + @currentChar END SET @i = @i + 1 END RETURN @result END
使用示例
创建好函数后,就可以像Oracle里那样调用了:
SELECT dbo.TO_MULTI_BYTE('bcd 123!@# 测试中文')
返回结果:bcd 123!@# 测试中文
可以看到,半角的字母、数字、符号都被转成了全角,而中文和原本就是全角的字符会被原样保留。
备选方案:用TRANSLATE快速转换特定字符
如果你只需要转换某几种特定的半角字符,也可以用TRANSLATE函数,不用写循环:
SELECT TRANSLATE('bcd123!@#', 'abcdefghijklmnopqrstuvwxyz0123456789!@#', 'abcdefghijklmnopqrstuvwxyz0123456789!@#')
不过这种方式需要手动列出所有要转换的字符对,适合需求比较窄的场景,通用程度不如自定义函数。
内容的提问来源于stack exchange,提问作者Thanh Long
相关产品推荐
相关产品推荐

