Alexei Asked: 2018-01-12 01:28:39 +0800 CST2018-01-12 01:28:39 +0800 CST 2018-01-12 01:28:39 +0800 CST 可以将 SQL Server 配置为不以静默方式截断 VARCHAR 值吗? 772 在像这样的某些场景中,SQL Server 会在错误地声明变量时静默截断 (N)VARCHAR 值,从而导致严重的数据丢失。 问题:可以将 SQL Server 配置为不静默截断 VARCHAR 值吗?(并发出错误/引发异常) sql-server sql-server-2014 2 个回答 Voted Best Answer David Browne - Microsoft 2018-01-12T07:02:17+08:002018-01-12T07:02:17+08:00 不,没有办法改变这种行为。但是这种截断只发生在变量和参数分配中,而不是表插入。 例如 declare @str varchar(8) = 'some very long string' 会被默默地截断 但插入: create table #t(a varchar(8)) insert into #t(a) values('some very long string') 将失败 Msg 8152, Level 16, State 14, Line 7 String or binary data would be truncated. 这是 TSQL 允许使用隐式转换的结果,这在许多情况下很方便,但有时很麻烦。 John K. N. 2018-01-12T01:51:51+08:002018-01-12T01:51:51+08:00 数据库引擎有一些用于处理数据类型的内置默认值。 数据类型的定义char如下varchar: char [ ( n ) ]固定长度的非 Unicode 字符串数据。n定义字符串长度,并且必须是 1 到 8,000 之间的值。存储大小为n字节。char 的 ISO 同义词是 character。 varchar [ ( n | max ) ]可变长度、非 Unicode 字符串数据。n定义字符串长度,可以是 1 到 8,000 之间的值。max表示最大存储大小为 2^31-1 字节(2 GB)。存储大小是输入数据的实际长度 + 2 个字节。varchar 的 ISO 同义词是 charvarying 或 charactervariing。 Forchar和varchar默认值如下: 在数据定义或变量声明语句中n未指定时,默认长度为1. 使用 CAST 和 CONVERT函数时未指定时,默认n长度为.30 如果您没有定义长度,那么 SQL Server 将为您完成。 参考 char 和 varchar (Transact-SQL)
不,没有办法改变这种行为。但是这种截断只发生在变量和参数分配中,而不是表插入。
例如
会被默默地截断
但插入:
将失败
这是 TSQL 允许使用隐式转换的结果,这在许多情况下很方便,但有时很麻烦。
数据库引擎有一些用于处理数据类型的内置默认值。
数据类型的定义
char
如下varchar
:For
char
和varchar
默认值如下:如果您没有定义长度,那么 SQL Server 将为您完成。
参考