为什么CAST截断文本而不是抛出错误



将文本强制转换为短于值的长度会导致截断文本。

select
cast('ROAD-1234' as varchar2(8)) as id
from
dual
ID      
--------
ROAD-123     
--^ Notice that the number 4 has been removed

我本以为CAST AS VARCHAR2的行为与CAST AS NUMBER类似。

select
cast(1234 as number(3)) as id
from
dual
Error: ORA-01438: value larger than specified precision allowed for this column

为什么CAST AS VARCHAR2静默地截断文本,而不是像CAST AS NUMBER那样抛出错误?

这是ANSI SQL标准的一部分,其他符合ANSI SQL的RDBMS也这样做:

对于固定长度的字符串目标,如果源的长度等于目标的固定长度,则CAST的结果就是源字符串。如果源的长度短于目标的固定长度,则CAST的结果是源字符串填充在右侧,但需要许多空格才能使长度匹配。如果源的长度比目标的固定长度长,则CAST的结果是包含尽可能多的源字符串的字符串——在这种情况下,如果截断的字符不全是空格,则DBMS将返回SQLSTATE警告01004";警告字符串数据,右截断";。

不幸的是,数据库通常不能同时发出警告并返回结果,因此它们会静默地截断结果

相关内容

  • 没有找到相关文章

最新更新