“通常,即使不这样做,你也会得到正确的结果。”
例子:
select CONVERT(varchar, getdate(), 112)
输出
20240417
我在 Stack Exchange 上的很多地方都看到了这一点,直到我发现了一个小注释,告诉读者不要忘记括号中的长度。我声称,如果您为这样的日期时间设置样式编号,则不需要这样做。然而,我现在有了足够的洞察力来理解“varchar 永远不应该独立”,它应该总是写成类似varchar(1234)
.
至于上面的代码,那就是:
select CONVERT(varchar(8), getdate(), 112)
如果你看一下,输出是相同的:
20240417
下面的评论更进一步:char(8)
应该采取因为
样式 112 中的任何值都不会少于 8 个字符。
为什么写 varchar 时总是要把长度放在后面的括号里呢?
经常和总是是两个截然不同的事情。
例子:
输出缺失
uts
这是由于默认行为:
这意味着定义中没有字节数的任何东西充其量都是一个最终的错误,最坏的情况是导致没有人知道的数据丢失。
另请注意,n表示字节
varchar(n)
数,而不是字符数:例如,在 UTF8 排序规则上下文中,以下命令返回 16:
要存储该字符串,您至少需要
varchar(16)
,而不是varchar(4)
。不设置 varchar 的长度很普遍,请参见示例1/1/1753 在 SQL Server 中的意义是什么?投票最高的答案显示,
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
经过 13 年和 171,000 次观看后,没有人抱怨它。然而,广泛传播并不总是意味着良好。为什么要把长度放在every
varchar
后面?出去:
我认为不需要,
8
因为输出长度可能由 style 设置112
。然而, @AaronBertrand在将日期 yyyy-mm-dd 转换为整数 YYYYMM下的评论显示:另一条评论甚至要求你采取
char
而不是varchar
如果你确定它必须一直是那个长度:他的博客Bad Habits to Kick: Varchar without length深入展示了为什么应该将长度写在 any 后面的括号中
varchar
: