You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:11:21