Oracle DB Query问题:相同查询的不同行为

时间:2016-06-12 09:06:44

标签: sql oracle oracle11g type-conversion

以下是我的查询。在一个Oracle DB(11.2.3.0)中,这给了我错误,但在其他相同的Oracle DB下面的查询工作正常。无法理解这种不同的行为。

一个数据库的输出

SQL> select id  from cag where greeting_id=1111100001 for update;

ERROR at line 1:
ORA-01722: invalid number

其他数据库的输出

SQL> select id from cag where greeting_id=1111100001 for update;

ID - 9111100001 

是否有任何数据库内部设置?

1 个答案:

答案 0 :(得分:2)

您将号码存储在varchar2列中。这不是好的做法,原因很多,包括性能,但特别是因为它会导致像这样的数据问题。

如果该列只应包含数字,则将其设为实际数字列。

如果它是一个通用列,预计会保存数字和其他数据,那么您应该重新考虑设计,并将不同类型的数据放在正确类型的单独列中。 看起来就像预期它总是一个数字 - 你不会指望一个ID有不同的类型。

与此同时,要查询字符串列,您需要避免隐式转换。当你这样做的时候:

select id  from cag where greeting_id=1111100001;

数据库必须将greeting_id列中的每个字符串转换为数字,然后再将其与1111100001进行比较,这是从字符串到数字的隐式转换,即抛出错误 - 因为你有列中无法隐式转换的值。在一个数据库中,可以转换所有列值;另一方面,至少有一个值不能。如果您不期望那么请查看数据以查看某人是否存储了意外的内容,例如“无”或“无效”或“未知”,甚至是带有错误小数分隔符的小数部分。

如果在查找字符串时必须坚持使用字符串 - 将列数据与相同类型的值和文字进行比较:

select id  from cag where greeting_id='1111100001';

正确的方法是使列成为正确的数据类型。