将char列改为nchar后,无法用[0-9]匹配获取MAX(docref)的问题
nchar列LIKE匹配返回NULL的原因及解决方法
问题原因
- nchar是固定长度的Unicode字符类型,将char列转换为nchar后,所有数据都会被自动填充Unicode空格(U+0020)到列定义的长度。比如原char(20)转nchar(20)后,
TST/TT/22/02/0004这类字符串末尾会补6个空格,而你的LIKE模式N'TST/TT/22/02/[0-9][0-9][0-9][0-9]'仅匹配到最后四位数字,未覆盖末尾的空格,导致没有符合条件的记录,最终返回NULL。 - 并非
[0-9]通配符不能在nchar列使用,而是末尾空格破坏了字符串与匹配模式的结构一致性。
解决方法
方法1:在LIKE模式中加入末尾匹配
通过%匹配任意长度的末尾空格(或其他字符),修改后的SQL语句:
SELECT MAX(docref) FROM docHeader WHERE docref LIKE N'TST/TT/22/02/[0-9][0-9][0-9][0-9]%'
方法2:去除字段末尾空格后匹配
使用RTRIM函数去掉nchar字段的末尾空格,再执行匹配:
SELECT MAX(docref) FROM docHeader WHERE RTRIM(docref) LIKE N'TST/TT/22/02/[0-9][0-9][0-9][0-9]'
注意:如果业务场景中允许字段末尾存在有效空格,此方法不适用。
方法3:改用nvarchar类型(推荐)
将nchar改为可变长度的nvarchar类型,不会自动填充空格,与原char列的行为更一致,后续查询无需额外处理:
ALTER TABLE docHeader ALTER COLUMN docref NVARCHAR(20) -- 替换为实际列长度
内容的提问来源于stack exchange,提问作者learning
相关产品推荐
相关产品推荐

