将文本强制转换为短于值的长度会导致截断文本。
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";警告字符串数据,右截断";。
不幸的是,数据库通常不能同时发出警告并返回结果,因此它们会静默地截断结果