在SqlServer数据库的使用过程中,全角字符和半角字符的转换是常见需求,比如用户录入的姓名、地址等字段可能混合了全角和半角字符,需要统一格式来保证数据一致性,或者方便后续的模糊查询、数据统计操作。SqlServer本身没有提供内置的全角半角转换函数,因此需要通过自定义函数来实现转换逻辑。

全角和半角字符的编码规则
全角字符和半角字符的核心区别在于编码范围,常见字符的转换规则如下:
- 半角空格的ASCII码是32,全角空格的编码是12288
- 半角字符(数字、字母、英文标点)的ASCII码范围是33到126,对应的全角字符编码范围是65281到65374,两者之间的差值是65248
- 除了上述规则外的其他字符,一般不存在全角半角的对应关系,转换时保持原字符即可
全角转半角的自定义函数实现
根据编码规则,我们可以编写全角转半角的自定义函数,遍历输入字符串的每个字符,按照规则进行转换:
-- 全角转半角函数
CREATE FUNCTION dbo.FullToHalf (@str NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @i INT = 1
DECLARE @len INT = LEN(@str)
DECLARE @result NVARCHAR(4000) = N''
DECLARE @currentChar NCHAR(1)
DECLARE @charCode INT
WHILE @i <= @len
BEGIN
-- 获取当前字符
SET @currentChar = SUBSTRING(@str, @i, 1)
-- 获取字符的Unicode编码
SET @charCode = UNICODE(@currentChar)
-- 处理全角空格
IF @charCode = 12288
BEGIN
SET @result = @result + NCHAR(32)
END
-- 处理全角数字、字母、英文标点
ELSE IF @charCode >= 65281 AND @charCode <= 65374
BEGIN
SET @result = @result + NCHAR(@charCode - 65248)
END
-- 其他字符保持不变
ELSE
BEGIN
SET @result = @result + @currentChar
END
SET @i = @i + 1
END
RETURN @result
END
半角转全角的自定义函数实现
半角转全角的逻辑和全角转半角相反,同样遍历字符串每个字符,按照编码差值进行转换:
-- 半角转全角函数
CREATE FUNCTION dbo.HalfToFull (@str NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @i INT = 1
DECLARE @len INT = LEN(@str)
DECLARE @result NVARCHAR(4000) = N''
DECLARE @currentChar NCHAR(1)
DECLARE @charCode INT
WHILE @i <= @len
BEGIN
-- 获取当前字符
SET @currentChar = SUBSTRING(@str, @i, 1)
-- 获取字符的Unicode编码
SET @charCode = UNICODE(@currentChar)
-- 处理半角空格
IF @charCode = 32
BEGIN
SET @result = @result + NCHAR(12288)
END
-- 处理半角数字、字母、英文标点
ELSE IF @charCode >= 33 AND @charCode <= 126
BEGIN
SET @result = @result + NCHAR(@charCode + 65248)
END
-- 其他字符保持不变
ELSE
BEGIN
SET @result = @result + @currentChar
END
SET @i = @i + 1
END
RETURN @result
END
函数的使用方法
函数创建完成后,可以直接在查询中使用,示例如下:
-- 测试全角转半角 SELECT dbo.FullToHalf(N'Hello World 123') AS HalfResult -- 返回结果:Hello World 123 -- 测试半角转全角 SELECT dbo.HalfToFull(N'Hello World 123') AS FullResult -- 返回结果:Hello World 123 -- 对表中字段进行转换 SELECT user_name, dbo.FullToHalf(user_name) AS half_user_name FROM user_info WHERE user_name LIKE N'%e%'
注意事项
- 函数中的字符串参数使用
NVARCHAR类型,避免中文等Unicode字符出现乱码 - 如果输入的字符串长度超过4000,可以调整函数参数的长度定义,比如改成
NVARCHAR(MAX) - 转换仅针对常见的数字、字母、英文标点和空格,其他字符比如中文、全角中文标点等不会进行转换,也不会被修改
- 函数创建后,需要有对应的数据库权限才能调用,一般给相关用户授予函数的执行权限即可