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

Use*_*973 4 oracle casting truncate varchar2 oracle18c

将文本转换为比值短长度会导致文本被截断。

select
    cast('ROAD-1234' as varchar2(8)) as id
from
    dual

ID      
--------
ROAD-123     
     --^ Notice that the number 4 has been removed
Run Code Online (Sandbox Code Playgroud)

我原以为这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
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

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

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