SQL Server自定义Remove_Non_Alphanumeric函数过滤字符异常问题
问题排查与解决方法
核心问题根源
- 编码隐式转换异常:你的函数输入参数和返回值都用了
VARCHAR类型,仅支持单字节字符存储。如果传入的原始字符串包含Unicode字符(比如特殊项目符号、全角字符、小语种文字等),SQL Server会自动将无法匹配当前数据库排序规则对应代码页的Unicode字符转换为?,这就是返回结果中出现意料之外?的原因。部分项目符号刚好落在你当前代码页的单字节字符范围内,不会被转成?,同时你的允许字符集合没有排除这类符号,就会被保留下来。 - 通配符规则编写错误:
PATINDEX的[^]排除集合不需要额外加|作为字符分隔符,你写的|反而会被识别为允许保留的字符;另外连字符-放在集合中间会被识别为范围匹配符,而非普通的连字符,导致实际匹配逻辑和你预期不一致。
修复后的函数代码
ALTER FUNCTION [dbo].[Remove_Non_Alphanumeric] (@String_Parameter NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN -- 注意:[^]内直接列允许的字符,不需要分隔符,-放到最末尾避免被识别为范围符 DECLARE @Allow_Characters NVARCHAR(500) = N'%[^A-Za-z0-9 ?,&/().' + NCHAR(13) + NCHAR(10) + N'()[]-]%'; WHILE PATINDEX(@Allow_Characters, @String_Parameter) > 0 BEGIN SELECT @String_Parameter = STUFF(@String_Parameter, PATINDEX(@Allow_Characters, @String_Parameter), 1, N''); END RETURN @String_Parameter; END
验证调整建议
- 如果需要额外过滤掉单字节项目符号,直接将对应符号从上面的允许字符集合中删除即可
- 如果后续需要新增允许保留的特殊字符,直接追加到
[^]的字符列表中即可,不需要加任何分隔符
内容的提问来源于stack exchange,提问作者Richard Housham
相关产品推荐
相关产品推荐

