技术分享 | MySQL 隐式转换必知必会


作者:张洛丹,热衷于数据库技术,不断探索,期望未来能够撰写更有深度的文章,输出更有价值的内容!

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 3000 字,预计阅读需要 10 分钟。


在生产环境中经常会有一些隐式类型转换导致SQL索引失效,性能极差,进而影响影响集群负载和业务的情况。本文总结了隐式转换常见的场景,在生产中要尽量避免 SQL 隐式转换的出现。

常见的 SQL 产生隐式转换的场景有:

  1. 数据类型的隐式转换
  2. 字符集的隐式转换

其中,特别是在表连接场景和存储过程中的字符集转换很容易被忽略。

说明:字符集是针对字符类型数据的编码规则,对于数值类型则不需要进行转换字符集。

1数据类型的隐式转换

测试表结构

t1
表字段 a
为 VARCHAR 类型,t2
表字段 a
为 INT 类型。

mysql> show create database test1\G<br>*************************** 1. row ***************************<br>       Database: test1<br>Create Database: CREATE DATABASE `test1` /*!40100 DEFAULT CHARACTER SET utf8 */<br>1 row in set (0.00 sec)<br>mysql> show create table t1\G<br>*************************** 1. row ***************************<br>       Table: t1<br>Create Table: CREATE TABLE `t1` (<br>  `id` int(11) NOT NULL,<br>  `a` varchar(20) DEFAULT NULL,<br>  `b` varchar(20) DEFAULT NULL,<br>  PRIMARY KEY (`id`),<br>  KEY `a` (`a`)<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8<br>1 row in set (0.00 sec)<br>mysql> show create table t2\G<br>*************************** 1. row ***************************<br>       Table: t2<br>Create Table: CREATE TABLE `t2` (<br>  `id` int(11) NOT NULL,<br>  `a` int(11) DEFAULT NULL,<br>  `b` varchar(20) DEFAULT NULL,<br>  PRIMARY KEY (`id`),<br>  KEY `a` (`a`)<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8<br>1 row in set (0.00 sec)<br>