技术分享 | MySQL 隐式转换必知必会
作者:张洛丹,热衷于数据库技术,不断探索,期望未来能够撰写更有深度的文章,输出更有价值的内容!
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 3000 字,预计阅读需要 10 分钟。
在生产环境中经常会有一些隐式类型转换导致SQL索引失效,性能极差,进而影响影响集群负载和业务的情况。本文总结了隐式转换常见的场景,在生产中要尽量避免 SQL 隐式转换的出现。
常见的 SQL 产生隐式转换的场景有:
- 数据类型的隐式转换
- 字符集的隐式转换
其中,特别是在表连接场景和存储过程中的字符集转换很容易被忽略。
说明:字符集是针对字符类型数据的编码规则,对于数值类型则不需要进行转换字符集。
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>