将文本转换为比值更短的长度会导致文本被截断。
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为什么投射作为VARCHAR2以静默方式截断文本而不是抛出像CAST那样的错误呢?
发布于 2020-09-20 16:07:01
这是ANSI SQL标准的一部分,其他兼容ANSI SQL的RDBMS也是这样做的:
对于固定长度的字符串目标,如果源的长度等于目标的固定长度,则强制转换的结果是源字符串。如果源的长度小于目标的固定长度,则转换的结果是右侧填充的源字符串,但是需要多个空格才能使长度匹配。如果源的长度大于目标的固定长度,则强制转换的结果是尽可能多地包含源字符串的字符串--在这种情况下,如果截断的字符不是所有空格,DBMS将返回SQLSTATE警告01004“警告-字符串数据,右截断”。
不幸的是,数据库通常不能同时发出警告和返回结果,因此它们会悄悄地截断结果。
https://stackoverflow.com/questions/63980242
复制相似问题