ORA-01722 invalid number 一个比较隐蔽的可能错误原因
2024-09-07 20:28:48
在Oracle数据库中,数据类型为char或者varchar的字段,里面存储的数据,可以是纯数字串,比如: 3433,也可以是带有英文字符的字符串,比如: 3433a。
Oracle对于纯数字串,其查询方式是比较随意的,where alert_id = '3433' 或者where alert_id = 3433 这两种查询条件都可以,也就是说,带引号或者不带引号都可以。
Oracle对于字符串,则只能用上面第一种方式(带引号),如果用第二种方式(不带引号),则会报错:ORA-01722: invalid number。
也就是说,虽然数据类型是一样的,但是Oracle内部对于纯数字串和字符串还是有所区分的,而且Oracle认为这个字段的所有数据都是这种类型。这个纯数字串和字符串的相互转化,可能就取决于一条数据。
如果在一个数据库中的某个字段,以前的数据都是纯数字串,这个时候你一定要注意,不要轻易向里面插入(或者更新为)一个字符串。因为以前的源代码可能两种查询方式都用了,你一旦插入一个字符串,则该字段的所有数据都变为字符串,以前用的第二种查询方式就不能用了。
这个错误很隐蔽,因为源代码并没有改变,这个位置的数据也没有改变,只是其他位置的数据改变了。如果改变数据库的人和编写源代码的人不是同一个人,就更难发现了。
因此,如果不想修改源代码的话,还是按照以前的方式来吧。
最新文章
- ORACLE 利用 REPLACE函数替换字段字符串
- Backbone框架浅析
- string的+操作与StringBuilder对象
- Java设计模式-Builder生成器模式
- 推荐一本好书给即将走入工作的程序员and程序媴
- 搭建Android开发环境之——Android4.0.3, 4.1, 4.2, 4.3, 4.x,及升级 ADT(22.0.5)和SDK(22.x)
- MySQL 常用命令大全
- PHP奇怪现象
- 支付宝开发中return_url和notify_url的区别分析
- 用javascript实现base64编码器
- java集合的操作(set,Iterator)
- java学习——平台的安装与部署
- 【模板小程序】求第n个质数
- CancellationTokenSource 和 CancellationToken 取消线程
- docker中的数据库
- 20165317 学习基础和C语言基础调查
- 操作 html 的时候是使用 dom 方法还是字符串拼接?
- SaltStack 和 Ansible 的简单比较
- 洛谷 P1144 最短路计数
- 七牛云存储 qiniu 域名 回收 文件上传 备份 下载 MD