MySQL 隐式转换

字段类型定义

CREATE TABLE `user` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',/* ...... */`name` varchar(10) NOT NULL DEFAULT '' COMMENT '姓名',/* ...... */PRIMARY KEY (`id`),KEY `idx_name` (`name`,`nickname`),/* ...... */
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

索引类型注意

字段类型为“字符串”

  • 查询:数字
mysql> EXPLAIN SELECT * FROM user WHERE name=123;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | user  | ALL  | idx_name      | NULL | NULL    | NULL | 21541 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)
  • 查询:字符串
mysql> EXPLAIN SELECT * FROM user WHERE name='123';
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref   | rows | Extra                 |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------+
|  1 | SIMPLE      | user  | ref  | idx_name      | idx_name | 32      | const |    1 | Using index condition |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------+
1 row in set (0.00 sec)

对比结果

当字段类型是varchar等字符类时,如果查询值是数字类型,索引不生效。

字段类型为“数字”

  • 查询:字符串
mysql> EXPLAIN SELECT * FROM user WHERE id='12';
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | user  | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)
  • 查询:数字
mysql> EXPLAIN SELECT * FROM user WHERE id=12;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | user  | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)

对比结果

字符串会被转为整数处理,所以对定义为整数类型的字段而言,索引都可以用到;

说明

只有字段类型和查询的字段值类型对应时,才可用。


隐式转换

mysql>  SELECT 'a'+123, 's'+'234', 5+'ab', 66+'kj', CONCAT(56, 'go');
+---------+-----------+--------+---------+------------------+
| 'a'+123 | 's'+'234' | 5+'ab' | 66+'kj' | CONCAT(56, 'go') |
+---------+-----------+--------+---------+------------------+
|     123 |       234 |      5 |      66 | 56go             |
+---------+-----------+--------+---------+------------------+
1 row in set, 4 warnings (0.00 sec)

说明

MySQL会将数字和字符串的直接相加,
转为整数型;可以使用CONCAT函数转为字符串类型;

隐式转化把字符串转为了整数类型。但是因为字符串是非数字型的,所以就会被转换为0


MySQL文档说明

When an operator is used with operands of different types, type conversion occurs to make the operands compatible.当操作符与不同类型的操作数一起使用时,将进行类型转换以使操作数兼容。

MySQL 隐式转换 字符串和整型说明相关推荐

  1. mysql 隐式失误_评“MySQL 隐式转换引起的执行结果错误”

    今天看到一篇关于MySQL隐式转换引发执行结果错误的文章: ====================================================================== ...

  2. mysql日期隐式转换_关于MySQL隐式转换

    一.如果表定义的是varchar字段,传入的是数字,则会发生隐式转换. 1.表DDL 2.传int的sql 3.传字符串的sql 仔细看下表结构,rid的字段类型: 而用户传入的是int,这里会有一个 ...

  3. mysql not in 转化_解析MySQL隐式转换问题

    一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1G *************************** 1. row ***** ...

  4. mysql数据库隐式表_解析MySQL隐式转换问题

    一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1\G *************************** 1. row **** ...

  5. mysql 隐式转换 索引_MySQL SQL优化之字符串索引隐式转换

    之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...

  6. mysql 隐式转换 索引_MySQL性能优化:MySQL中的隐式转换造成的索引失效

    数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...

  7. 令人炸毛儿的MySQL隐式转换 - 无形之刃,最为致命

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录   我相信90%以上的同学们在平时开发时,或多或少都被隐式转换(CONVERT_IMPLICIT)坑过,甚至测出bug ...

  8. mysql隐式转换造成索引失效的事故总结

    隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给mysql,这样 ...

  9. MySql 隐式转换

    隐式转换主要发生在查询数字类型是出现.如把查询money=11写成age='11',tel="13323533013"写成tel=13323533013; 影响: 先贴个表结构: ...

最新文章

  1. (0086)iOS开发之iPhone 屏幕尺寸、分辨率、ppi以及@2x@3x图
  2. 《Effective Java读书笔记》--序列化
  3. CSDN博客如何转载(技术贴)
  4. 数据库系统概论:第七章 数据库设计
  5. BUGLY集成升级空指针问题
  6. 1028. List Sorting (25)
  7. android开发学习之路——连连看之游戏逻辑(五)
  8. 在Java错误产生之前对其进行处理的新方法
  9. mybatis学习(52):扩展结果的展现
  10. Python安装工具包踩过的坑
  11. 转载一朋友的qq空间,感觉都是至理名言啊!
  12. field list什么意思_Redis:我这21个灵魂拷问你拿什么挡?
  13. 山东新动能软件创新·创业大赛 首场宣讲答疑会顺利举行
  14. ubuntu linux qq闪退
  15. 软考答题卡如何填写,这些你都清楚吗?
  16. 如何将360全景图导出高清短视频分享到视频平台上?
  17. OpenCv阈值化处理cv2.threshold()函数
  18. 展示正在活动时间内的活动,过期活动不显示
  19. XXE漏洞介绍及利用
  20. (2022 IV) RCBEV

热门文章

  1. linux四种集群是什么,lvs四种集群特点及使用场景
  2. python list长度_python的入门阶段 编程思维100题 我跟罗志祥没关系
  3. r语言教程w3c,R语言 数据库
  4. Spring中Bean的作用域都有哪些?
  5. 威斯康星大学计算机专业找工作,威斯康星麦迪逊大学计算机申请条件有哪些?...
  6. IDEA中安装配置Jrebel热部署插件用法笔记
  7. 远程办公的一天:魔幻24小时
  8. SQLl中的left join、right join、inner join详解
  9. linux查看 idt日志,实现RCP的日志管理
  10. python convert函数_Python内置函数