MySQL一个字符集转换的骚操作,酿下性能的苦果
时间:2022-07-26
本文章向大家介绍MySQL一个字符集转换的骚操作,酿下性能的苦果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天处理了一个RDS的问题,突然想起了好几年前处理的一个性能案例,看似不经意的细节竟然让我对整个问题的过程有了更清晰的认识。
整个细节可以参见我写的这篇文章的处理过程: 力荐:一条update语句引发的“血案”
当时有一个地方没有想明白,那就是里面的字段APNS_PUSH_ID为什么字符集会是latin1,而表的字符集却妥妥的是UTF8,看起来是一个不大可能出现的场景。
下午在协助处理一个问题的时候,才突然明白,我来复现下这个问题。
创建一张表test_charset,设置字符集为latin1
mysql> create table test_charset(id int primary key,name varchar(30),memo varchar(30)) charset=latin1;
Query OK, 0 rows affected (0.12 sec)
查看表结构,可以清晰的看到,字段是共享了表的默认字符集,没有显式显示出来。
mysql> show create table test_charsetG
*************************** 1. row ***************************
Table: test_charset
Create Table: CREATE TABLE `test_charset` (
`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`memo` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
我们使用如下的语句来变更下表的字符集。
mysql> alter table test_charset charset=utf8;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
这个时候再次查看就会发现,原本“继承”的latin1字符集现在显式显示出来了,表的字符集是utf8,但是字符类型的字段字符集依然是latin1
mysql> show create table test_charsetG
*************************** 1. row ***************************
Table: test_charset
Create Table: CREATE TABLE `test_charset` (
`id` int(11) NOT NULL,
`name` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
`memo` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
如果后续再添加字段,不显式指定字符集。
mysql> alter table test_charset add memo2 varchar(30);
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看表结构会发现,新字段memo2的字符集就会是utf8
mysql> show create table test_charsetG
*************************** 1. row ***************************
Table: test_charset
Create Table: CREATE TABLE `test_charset` (
`id` int(11) NOT NULL,
`name` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
`memo` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
`memo2` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
好了,问题到了这里就相对有了一个思路。
那么产生最开始让人疑惑的问题原因是什么呢?就是哪个骚操作:
mysql> alter table test_charset charset=utf8;
这是一个表级属性的变更,注意MySQL里面字段,表,数据库都可以存在差异化的字符集设置。虽然可以支持,但是显然这样做是不合理的。
而如果要让字段的变更同时生效,应该使用convert to 语句,我们为了突出变化,改为utf8mb4字符集。
mysql> alter table test_charset convert to charset utf8mb4;
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table test_charsetG
*************************** 1. row ***************************
Table: test_charset
Create Table: CREATE TABLE `test_charset` (
`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`memo` varchar(30) DEFAULT NULL,
`memo2` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
- 02-移动端开发教程-CSS3新特性(中)
- 强悍!Java 9 中的9个新特性
- 神经网络反向传播梯度计算数学原理
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- 从零开始写项目第三篇【在线聊天和个人收藏夹】
- TiDB 源码阅读系列文章(六)Select 语句概览
- 从零开始写项目第四篇【搭建Linux环境】
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
- 深入nDPI
- 44个Java代码性能优化总结
- 干货:Java正确获取客户端真实IP方法整理
- sublime学习笔记
- Java程序员必须掌握的常用Linux命令。
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 自定义个范围的x,y坐标(python画图)
- 5s!用浏览器打造一个开箱即用的Linux系统
- pandas、numpy功能整理,包括机器学习的部分库
- 全能型终端神器!好用、免费!
- 初试geopandas
- 要实现60FPS动画, 你需要了解这些
- 数论-素数
- 自动补全、回滚!介绍一款可视化 sql 诊断利器
- 深度学习-IMBD二分类问题
- 开源、强大的Linux服务器集群管理工具,比宝塔好用!
- 组合数学-抽屉原理
- 利用 Harbor 搭建企业级私有镜像仓库
- Redis-Java项目应用(Jedis、SpringBoot整合、工具类模板)
- 微软被指剽窃他人开源作品!作者被迫终止该项目
- 秋招系列 | 推荐岗史上最强面经来袭(上)