@@ -117,9 +117,9 @@ CALL pre_test1();
117
117
118
118
根据官方文档的描述,我们的第 23 两条 SQL 都发生了隐式转换,第 2 条 SQL 的查询条件` num1 = '10000' ` ,左边是` int ` 类型右边是字符串,第 3 条 SQL 相反,那么根据官方转换规则第 7 条,左右两边都会转换为浮点数再进行比较。
119
119
120
- 先看第 2 条 SQL:` SELECT * FROM ` test1` WHERE num1 = '10000'; ` ** 左边为 int 类型** ` 10000 ` ,转换为浮点数还是` 10000 ` ,右边字符串类型` '10000' ` ,转换为浮点数也是` 10000 ` 。两边的转换结果都是唯一确定的,所以不影响使用索引。
120
+ 先看第 2 条 SQL:`` SELECT * FROM `test1` WHERE num1 = '10000'; ` ` ** 左边为 int 类型** ` 10000 ` ,转换为浮点数还是` 10000 ` ,右边字符串类型` '10000' ` ,转换为浮点数也是` 10000 ` 。两边的转换结果都是唯一确定的,所以不影响使用索引。
121
121
122
- 第 3 条 SQL:` SELECT * FROM ` test1` WHERE num2 = 10000; ` ** 左边是字符串类型** ` '10000' ` ,转浮点数为 10000 是唯一的,右边` int ` 类型` 10000 ` 转换结果也是唯一的。但是,因为左边是检索条件,` '10000' ` 转到` 10000 ` 虽然是唯一,但是其他字符串也可以转换为` 10000 ` ,比如` '10000a' ` ,` '010000' ` ,` '10000' ` 等等都能转为浮点数` 10000 ` ,这样的情况下,是不能用到索引的。
122
+ 第 3 条 SQL:`` SELECT * FROM `test1` WHERE num2 = 10000; ` ` ** 左边是字符串类型** ` '10000' ` ,转浮点数为 10000 是唯一的,右边` int ` 类型` 10000 ` 转换结果也是唯一的。但是,因为左边是检索条件,` '10000' ` 转到` 10000 ` 虽然是唯一,但是其他字符串也可以转换为` 10000 ` ,比如` '10000a' ` ,` '010000' ` ,` '10000' ` 等等都能转为浮点数` 10000 ` ,这样的情况下,是不能用到索引的。
123
123
124
124
关于这个** 隐式转换** 我们可以通过查询测试验证一下,先插入几条数据,其中` num2='10000a' ` 、` '010000' ` 和` '10000' ` :
125
125
@@ -129,7 +129,7 @@ INSERT INTO `test1` (`id`, `num1`, `num2`, `type1`, `type2`, `str1`, `str2`) VAL
129
129
INSERT INTO ` test1` (` id` , ` num1` , ` num2` , ` type1` , ` type2` , ` str1` , ` str2` ) VALUES (' 10000003' , ' 10000' , ' 10000' , ' 0' , ' 0' , ' 2df3d9465ty2e4hd523' , ' 2df3d9465ty2e4hd523' );
130
130
```
131
131
132
- 然后使用第三条 SQL 语句` SELECT * FROM ` test1` WHERE num2 = 10000; ` 进行查询:
132
+ 然后使用第三条 SQL 语句`` SELECT * FROM `test1` WHERE num2 = 10000; ` ` 进行查询:
133
133
134
134
![ ] ( https://oss.javaguide.cn/github/javaguide/mysqlindex-invalidation-caused-by-implicit-conversion-03.png )
135
135
@@ -144,7 +144,7 @@ INSERT INTO `test1` (`id`, `num1`, `num2`, `type1`, `type2`, `str1`, `str2`) VAL
144
144
145
145
如此也就印证了之前的查询结果了。
146
146
147
- 再次写一条 SQL 查询 str1 字段:` SELECT * FROM ` test1` WHERE str1 = 1234; `
147
+ 再次写一条 SQL 查询 str1 字段:`` SELECT * FROM `test1` WHERE str1 = 1234; ` `
148
148
149
149
![ ] ( https://oss.javaguide.cn/github/javaguide/mysqlindex-invalidation-caused-by-implicit-conversion-05.png )
150
150
@@ -159,4 +159,4 @@ INSERT INTO `test1` (`id`, `num1`, `num2`, `type1`, `type2`, `str1`, `str2`) VAL
159
159
160
160
所以,我们在写 SQL 时一定要养成良好的习惯,查询的字段是什么类型,等号右边的条件就写成对应的类型。特别当查询的字段是字符串时,等号右边的条件一定要用引号引起来标明这是一个字符串,否则会造成索引失效触发全表扫描。
161
161
162
- <!-- @include: @article-footer.snippet.md -->
162
+ <!-- @include: @article-footer.snippet.md -->
0 commit comments