ITPub博客

首页 > 数据库 > MySQL > ERROR 1292 (22007): Truncated incorrect DOUBLE value 和ORA-01722: invalid number

ERROR 1292 (22007): Truncated incorrect DOUBLE value 和ORA-01722: invalid number

原创 MySQL 作者:gaopengtttt 时间:2016-04-06 23:45:56 0 删除 编辑
其实这种错误和隐式转换有关
主要是由于转换的时候不能转换为期望的格式的然后出的问题
比如 1p这个字符要转换为 int(number)是不可能的

MYSQL 错误模拟如下:


myql> show variables like 'sql_mode%';
+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------+
1 row in set (0.01 sec)


mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
mysql> create table jjjkk (id varchar(20),name varchar(20));
Query OK, 0 rows affected (0.03 sec)


mysql> insert into jjjkk values('1','gaopeng');
Query OK, 1 row affected (0.00 sec)


mysql> update jjjkk set name='gaop' where id=1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> update jjjkk set name='gaop' where id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0


mysql> insert into jjjkk values('1p','gaopeng');
Query OK, 1 row affected (0.01 sec)


mysql> commit;
Query OK, 0 rows affected (0.00 sec)


mysql> update jjjkk set name='gaop' where id=1;
ERROR 1292 (22007): Truncated incorrect DOUBLE value: '1p'




MYSQL 中存在隐式转换ORACLE中通常会在执行计划中给出to_char之类的标示
但是MYSQL执行计划没有
如上列子虽然'1'可以转换这个时候没有报错。但是新插入的'1p'是不能转换的
这个在ORACLE中也存在这样的问题。所以报错
ERROR 1292 (22007): Truncated incorrect DOUBLE value: '1p'
当然我是严格的SQL_MODE,否则则是WARINGS
可以如下试试转换:
 SELECT CONVERT('1',SIGNED);
 SELECT CONVERT('1p',SIGNED);


然后演示一下ORACLE的报错:
SQL> create table testmmm( id varchar2(20),name varchar2(20));
Table created


SQL> insert into testmmm values('1','gaopeng');
1 row inserted


SQL> commit;
Commit complete


SQL> select * from testmmm where id=1;
ID                   NAME
-------------------- --------------------
1                    gaopeng


SQL> insert into testmmm values('1p','gaopeng');
1 row inserted


SQL> commit;
Commit complete


SQL> select * from testmmm where id=1;
select * from testmmm where id=1
ORA-01722: invalid number

如果模拟
SQL> select to_number('1p') from dual;
select to_number('1p') from dual
ORA-01722: invalid number


同样的情况


我们查看一下执行计划中的隐式转换信息:
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(TO_NUMBER("ID")=1)
   
仅此记录MYSQL和ORACLE同样的报错

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7728585/viewspace-2076512/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
wxh gp_22389860 公众号 MySQL学习 书籍 深入理解MySQL主从原理

注册时间:2021-06-07

  • 博文量
    868
  • 访问量
    3495524