我有一个Oracle表和列( col1
)具有类型varchar2(12 byte)
。 它有一个排和值col1
是1234
当我说
select * from table where col1 = 1234
甲骨文表示无效号码。 这是为什么? 为什么我不能通过一些,当它是varchar2
?
编辑:所有的反应都很大。 谢谢。 但我无法理解为什么它没有考虑1234
时, 1234
是一个有效的VARCHAR2数据类型。
我有一个Oracle表和列( col1
)具有类型varchar2(12 byte)
。 它有一个排和值col1
是1234
当我说
select * from table where col1 = 1234
甲骨文表示无效号码。 这是为什么? 为什么我不能通过一些,当它是varchar2
?
编辑:所有的反应都很大。 谢谢。 但我无法理解为什么它没有考虑1234
时, 1234
是一个有效的VARCHAR2数据类型。
问题是,你预计甲骨文将隐式转换1234字符类型。 相反,甲骨文被隐式铸造列的数字。 有在列一个非数字的值,所以Oracle引发错误。 在Oracle文档警告说,不要隐式转换之前它解释了他们将如何得到解决。 这也解释了你所看到的行为规则是:
当用数字值进行比较的字符值,Oracle中的字符数据转换为数字值。
哦,这是更好的转换为char而不是数字:
select *
from table
where col1 = to_char(1234)
当COL1看起来并不像一个数字,TO_NUMBER返回一个错误,停止查询。
甲骨文表示无效号码。 这是为什么? 为什么我不能通过一些,当它是VARCHAR2?
甲骨文确实从性格类型的隐式转换col1
至数,因为你比较它作为一个数字。
另外,你认为1234
是多数民众赞成被提取的唯一行。 在现实中,Oracle必须从表中获取所有行,然后筛选出按在where
子句。 现在有一个字符值中col1
遇到你之前就是BEING进账1234
行&这是造成错误,因为该字符不能被转换为数字。
这小提琴显示的行为。 由于abc
canot被转换为数字,你会得到错误信息
现在,如果表中的唯一记录是包含数字字符COL1,你会看到, 声明将正常工作