MySQL数据库SQL语句中不可省去的引号

有一次在代码中发现了一个BUG,在排查过程中,差点晕翻;
作一个DBA也碰到这种低级错误;大为自嘲。
其实这个问题在官方手册里就写得很明白;(可见官方文档的重要性)


mysql> create table h1 (id int , col1 char(1));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into h1 select 1,’I';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into h1 select 2,’F';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into h1 select 2,’0′;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from h1 ;
+——+——+
| id   | col1 |
+——+——+
|    1 | I    |
|    2 | F    |
|    2 | 0    |
+——+——+
3 rows in set (0.00 sec)

mysql> select * from h1 where col1=0;
+——+——+
| id   | col1 |
+——+——+
|    1 | I    |
|    2 | F    |
|    2 | 0    |
+——+——+
3 rows in set, 2 warnings (0.00 sec)

mysql> select * from h1 where col1=’0′;
+——+——+
| id   | col1 |
+——+——+
|    2 | 0    |
+——+——+
1 row in set (0.00 sec)

mysql> select * from h1 where col1=’1′;
Empty set (0.00 sec)

mysql> select * from h1 where col1=1;
Empty set, 2 warnings (0.00 sec)

发现没有:
col1=0   ; 所有行被选中;
col1=’0′ ; 结果集正常
mysql> select * from h1 where col1=’1′;
Empty set (0.00 sec)

mysql> select * from h1 where col1=1;
Empty set, 2 warnings (0.00 sec)

想知道为什么吗?
看这里.

mysql> show warnings;
+———+——+—————————————+
| Level   | Code | Message                               |
+———+——+—————————————+
| Warning | 1292 | Truncated incorrect DOUBLE value: ‘I’ |
| Warning | 1292 | Truncated incorrect DOUBLE value: ‘F’ |
+———+——+—————————————+
2 rows in set (0.00 sec)

MySQL当数据类型不匹配时,尊重用户的输入,将字段的类型做了隐式转换然后来匹配,而字符向数字转,结果都是0;

 

关联性文章:

SQL优化篇:数据类型隐形转换的危害

2 thoughts on “MySQL数据库SQL语句中不可省去的引号

  1. “MySQL当数据类型不匹配时,尊重用户的输入,将字段的类型做了隐式转换然后来匹配,而字符向数字转,结果都是0;”
    这句似乎存在问题:如果是类似’123abc’或者’123我’这样的字符串,MySQL会把他转为123也就是说在col1=123会查出这两个字符串.
    也就初步断定,在字符串转换为数字时,如果字符串是以数字开头,那么MySQL会主动转换前面的数字,并且会丢弃从非数字开始往后所有的字符.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>