SQL Server中nchar字段去除尾部空格UPDATE语句失效问题咨询
问题根因
UPDATE不生效的核心原因是[identifier]字段的数据类型为nchar(128),这是固定长度字符类型:当存入字段的字符串长度不足定义的128个字符时,SQL Server会自动在字符串尾部补全空格,直到填满128位的长度。就算你通过自定义函数清理了尾部空格,在UPDATE写回字段时,数据库会再次自动补全尾部空格,最终查询时看起来就是更新完全没有生效。
你之前SELECT语句能拿到去空格的结果,是因为函数处理后的结果只是临时返回,没有写回固定长度的字段里,所以不会触发自动补空格的逻辑。
解决方法
根据实际业务场景二选一即可:
- 方案1(推荐,从根源解决问题):将字段类型修改为可变长度字符类型,取消自动补空格的特性
先执行字段类型变更语句,注意要和原字段的非空约束保持一致:如果原字段允许存储NULL值,就去掉语句里的NOT NULL
字段类型修改完成后,再执行你之前写的UPDATE语句,就能正常把去空格后的结果存进字段,不会再被自动补回尾部空格:ALTER TABLE [AHDRC].[dbo].[artworks] ALTER COLUMN [identifier] nvarchar(128) NOT NULL;UPDATE [AHDRC].[dbo].[artworks] SET [identifier] = [dbo].[udf-Str-Strip-Control](identifier); - 方案2:如果业务规则不允许修改字段类型,就不需要做UPDATE操作了——固定长度字段的尾部空格是数据库自动维护的,无法永久删除。你可以在所有用到这个字段拼接URL、做业务逻辑处理的场景下,读取字段时实时套上
[dbo].[udf-Str-Strip-Control](identifier)或者RTRIM(identifier)来截断尾部空格即可。
效果验证
更新完成后可以执行以下语句确认清理结果:
SELECT [identifier], LEN([identifier]) AS 内容实际字符长度, DATALENGTH([identifier]) AS 字段存储占用字节长度 FROM [AHDRC].[dbo].[artworks];
改为nvarchar类型并更新后,字符串不会再被强制补到128字符长度,拼接浏览器URL时也不会再出现尾部空格转成的%20字符。
内容的提问来源于stack exchange,提问作者DaSernet
相关产品推荐
相关产品推荐

