mysql聚合索引失效
索引是可以高效的获取数据的数据结构, 对查询有很大作用. 索引对于数据库, 就像偏旁部首, 或者26个英文字母对于字典一样, 能很快的提高查询速度.但是索引也有它的缺点:首先就是占用磁盘空间其次是虽然...
2024.11.15前段时间参考网上教程用脚本批量修改了数据库的字符集,过了一天后业务反馈某个功能用不了,检查发现数据库字符类型的字段的默认值和说明全部为空,用实验测试了一下果然脚本存在一些bug,后续因此加班了一整晚,印象深刻,这里介绍一下实验过程。
1、创建表先建一个utf8编码的表:
CREATE TABLE `t1` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `USER_CODE` varchar(225) NOT NULL DEFAULT ‘01112341‘ COMMENT ‘用户编码‘, `START_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `NEED_DAYS` decimal(4,1) NOT NULL COMMENT ‘请假天数‘, `LEAVE_REASON` varchar(255) DEFAULT ‘事假‘ COMMENT ‘请假理由‘, PRIMARY KEY (`ID`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC注意上面的字段类型,后面做对比。
2、用脚本修改字符集select TABLE_SCHEMA ‘数据库‘, TABLE_NAME ‘表‘, COLUMN_NAME ‘字段‘, CHARACTER_SET_NAME ‘原字符集‘, COLLATION_NAME ‘原排序规则‘, concat( ‘ALTER TABLE ‘, TABLE_SCHEMA, ‘.‘, TABLE_NAME, ‘ MODIFY COLUMN ‘, COLUMN_NAME, ‘ ‘, COLUMN_TYPE, ‘ CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;‘ ) ‘修正SQL‘ FROM information_schema.`COLUMNS` WHERE TABLE_NAME = ‘t1‘ AND CHARACTER_SET_NAME = ‘utf8‘;--修正脚本:ALTER TABLE t1.t1 MODIFY COLUMN USER_CODE varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;ALTER TABLE t1.t1 MODIFY COLUMN LEAVE_REASON varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;3、查看t1表验证4、结构同步测试一下NAVICAT的结构同步是否有这种情况
5、修改脚本如下:select c.TABLE_SCHEMA ‘数据库‘, c.TABLE_NAME ‘表‘, c.COLUMN_NAME ‘字段‘, c.COLUMN_DEFAULT ‘默认值‘, c.IS_NULLABLE ‘是否为空‘, c.DATA_TYPE ‘字段类型‘, c.character_set_name ‘原字符集‘, c.collation_name ‘原排序规则‘, concat( ‘ALTER TABLE ‘, TABLE_SCHEMA, ‘.‘, TABLE_NAME, ‘ MODIFY COLUMN ‘, COLUMN_NAME, ‘ ‘, COLUMN_TYPE, ‘ CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ‘, CASE WHEN c.is_nullable = ‘NO‘ THEN ‘NOT NULL‘ ELSE ‘NULL‘ END, CASE WHEN c.COLUMN_DEFAULT = ‘‘ THEN ‘ DEFAULT ‘‘‘‘‘ WHEN c.COLUMN_DEFAULT IS NULL THEN ‘ DEFAULT NULL‘ ELSE concat( ‘ DEFAULT ‘, ‘‘‘‘, c.COLUMN_DEFAULT, ‘‘‘‘ ) END, ‘ comment ‘, ‘‘‘‘, c.COLUMN_COMMENT, ‘‘‘‘, ‘;‘ ) ‘修正SQL‘ FROM information_schema.`COLUMNS` c WHERE table_name = ‘t1‘ AND CHARACTER_SET_NAME = ‘utf8mb4‘;--修正sql如下:ALTER TABLE t1.t1 MODIFY COLUMN USER_CODE varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL default ‘01112341‘ comment ‘用户编码‘;ALTER TABLE `t2`.`t1` MODIFY COLUMN `USER_CODE` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ‘‘ COMMENT ‘用户编码‘ AFTER `ID`;ALTER TABLE `t2`.`t1` MODIFY COLUMN `LEAVE_REASON` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT ‘请假理由‘ AFTER `NEED_DAYS`;综上所述:1、备份重于一切
因为有备份,所以故障发生时我们是直接从前一天拿一份最新的表结构,用文本编辑改utf8为utf8mb4,导到中间库做一下结构同步恢复的。
2、不能盲目相信网上内容
这一次就是因为拿到脚本后只是简单测试编码修改成功,没有进一步验证,忽略了其他地方才导致故障发生。
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
索引是可以高效的获取数据的数据结构, 对查询有很大作用. 索引对于数据库, 就像偏旁部首, 或者26个英文字母对于字典一样, 能很快的提高查询速度.但是索引也有它的缺点:首先就是占用磁盘空间其次是虽然...
2024.11.15概述mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innod...
2024.11.15前言:当我们需要对数据做筛选和查询的时候,往往会涉及到一些限制条件的判断,今天就分享一个判断字符串的技巧。在实际应用中,我们会遇到各种各样的需求,这些需求都跟数据库有着紧密的关系,在复杂的逻辑也只不过...
2024.11.15如果在应用开始阶段没有正确的设置字符集,在运行一段时间以后才发现存在不能满足要求需要调整,又不想丢弃这段时间的数据,那么就需要进行字符集的修改。字符集的修改不能直接通过“alter database ...
2024.11.15欢迎来到MySQL实战第17篇,修炼500篇成为MySQL高手!1.修改字段类型、字段属性alter table 表名 modify 字段名称 字段类型【字段属性】【first|after 字段名称】...
2024.11.15