oracle - 为什么 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“警告字符串数据,右截断”。
不幸的是,数据库通常不能同时发出警告和返回结果,所以它们会默默地截断结果
推荐阅读
- python - 如何使用python找到文件的真实文件扩展名
- r - 需要一种有效的方法将因子值从数据框的一列更改为另一列
- sql - Azure ARM 模板“VmAgentNotRunning”
- ios - 在子视图中时,我无法将按钮的 touchUpInside 调用到 ViewController
- json - 用 TCL 解析 JSON
- php - CakePHP中如何让SQL数据默认降序显示?
- python - 从数组中的字符串集中提取 ID 和值
- c++ - 为什么要修改集合的向量数据成员
导致这个程序无限运行? - linux - 单行列出目录中文件的旧版本
- java - 当我在 Java 中创建 LinkedList 时出现编译警告