加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver CAST(AS nvarchar)的坑 —— 类型转换截断数

发布时间:2022-12-07 15:33:02 所属栏目:MsSql教程 来源:网络
导读: 开发反馈数据同步时,写入表的数据被截断,例如:
查看该表对应字段类型为nvarchar(100),而同步使用的插入语句是INSERT INTO xxx VALUES(CAST ( AS nvarchar))。
创建一个测试表插入测试数

开发反馈数据同步时,写入表的数据被截断,例如:

查看该表对应字段类型为nvarchar(100),而同步使用的插入语句是INSERT INTO xxx VALUES(CAST ( AS nvarchar))。

创建一个测试表插入测试数据。

create table tmp0327(name nvarchar(100));
INSERT INTO tmp0327 VALUES(CAST ('ABC_DEFGHIJKL,Reference:ABC-31000000-ABCDEF,AES123456789' AS nvarchar));
INSERT INTO tmp0327 VALUES('ABC_DEFGHIJKL,Reference:ABC-31000000-ABCDEF,AES123456789');
Select datalength(name),* from tmp0327;

Mssq类型转换函数_函数类型表示函数的什么类型_数组函数转换

可以看到经过转换的字符串被截断了,而未转换的正常。怀疑CAST(AS nvarchar)有自动截断功能,去查一下官方文档的定义发现有如下介绍:

Mssq类型转换函数_函数类型表示函数的什么类型_数组函数转换

如果在字段定义或变量声明时不指定nvarchar(n) n的值Mssq类型转换函数,n默认是1;如果在CAST和CONVERT函数中,不指定n则默认是30。根据前面截图也可以看到 ABC_DEFGHIJKL,Reference:ABC-31 刚好是30位,长度为60。

所以如果我们希望插入时数据不被截断有两种方法:

INSERT INTO tmp0327 VALUES(CAST ('ABC_DEFGHIJKL,Reference:ABC-31000000-ABCDEF,AES123456789' AS nvarchar(100)));

数组函数转换_Mssq类型转换函数_函数类型表示函数的什么类型

另外可以再验证下官方文档说的,在字段定义或变量声明时不指定nvarchar(n) n的值,n默认是1

create table tmp0327_2(name nvarchar);

去看sqlserver中表的定义,可以看到确实是nvarchar(1)

Mssq类型转换函数_数组函数转换_函数类型表示函数的什么类型

参考

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!