首页 > 解决方案 > 为什么 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 那样抛出错误?

标签: oraclecastingtruncateoracle18cvarchar2

解决方案


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

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

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


推荐阅读