2024年6月14日排查问题简单记录

公司线上环境报错了,看报错是排序规则对于编码无效。

代码建表语句是之前交接的人写的。

其实正常情况表的编码和排序规则都是会统一指定的。

先问一下团队这方面的规范是什么,然后去查看一下相关的应该怎么查看怎么更改的知识。

关于mysql编码的一些文档。

https://dev.mysql.com/doc/refman/5.7/en/alter-table.html

https://dev.mysql.com/doc/refman/5.7/en/charset-table.html

https://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html

https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb3.html

中文方面的文档

https://www.docs4dev.com/docs/zh/mysql/5.7/reference/charset-unicode-utf8mb3.html

https://mysql.net.cn/doc/refman/8.0/en/charset-mysql.html

sql 复制代码
show create table table_name; -- 查看表结构(给出的是建表的语句)
select version(); -- 查看mysql的版本
show table status;  -- 查看collation列
select * from table_name;
from information_schema.`TABLES`
WHERE 
    table_schema='database_name'
    and `table_name`='table_name';

-- 修改表的编码
alter table `table_name` convert to character set 
utf8mb4 collate utf8mb4_bin;

-- 查看mysql支持的版本,加上筛选
show collation where charset='utf8';

show full columns from `table_name`; -- 查看各个字段的编码
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition;
-- 其中column_definition这里就可以写更改后的编码和排序规则,例如
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name charset utf8mb4 collate utf8mb4_bin 加其它原本的字段定义;
-- 也可以使用modify子句
ALTER TABLE table_name MODIFY column_name column_definition CHARACTER SET new_charset;

collation是排序规则,通过collation是可以确定编码集(charset)是什么的。所以上面的查看方法,大多都是只能看到utf8_bin之类的collation列,而看不到charset列。

发现测试环境的是8.0而正式环境的是5.7. ps:em,的确有点混乱了。

utf8mb3和utf8在mysql中其实是一回事。实际观察mysql来讲。

测试环境的8.0中collation显示的是utf8mb3,而正式环境的mysql 5.7.29-log版本中,显示的是utf.

因为正式环境和测试环境的版本不一致,测试环境没能测出来。

优先级是符合一般认知的,数据库层面可以设置,表层面可以设置,字段还可以指定。小的层面的设置是优先级更高的呀。

数据库连接的时候可以指定。

首先问团队正式库怎么查看,连上去之后查表、字段的编码设置。

然后问团队,服务启动的初始化配置文件怎么查看,去看初始化的配置的sql的DSN里的相关配置。

进行了相应的更改和确认,但是报错没有变化,还是有问题。

再询问团队的人正式环境的日志该如何查看。

后来看日志发现是生成的sql语句就指定了编码。

再在代码中追溯。发现ent框架的ContainsFold有个坑点,它直接预设编码是utfmb4,然后生成的sql会自动加上 COLLATE utf8mb4_general_ci.

如果实际的编码不是utfmb4,则会报错排序规则对于xxx编码无效的错误。

不过现在一想,不一定是仅仅是版本差异导致测试环境正常,还有可能是测试环境的数据没有中文,可能仅仅是英文的情况下,其实加了utf8mb4_general_ci语句也能执行,不会报错出来。

go 复制代码
		switch b.dialect {
		case dialect.MySQL:
			// We assume the CHARACTER SET is configured to utf8mb4,
			// because this how it is defined in dialect/sql/schema.
			b.Ident(col).WriteString(" COLLATE utf8mb4_general_ci LIKE ")
			b.Arg("%" + strings.ToLower(w) + "%")
        // ...
        }
相关推荐
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.15 小时前
基于MySQL一主一从环境添加多个新从库
android·mysql·adb
阿丰资源16 小时前
java项目(附资料)-基于SpringBoot+MyBatisPlus+MySQL+Layui的药品管理系统
java·spring boot·mysql
我科绝伦(Huanhuan Zhou)16 小时前
分享一个MySQL自动化部署平台
mysql·adb·自动化
一叶飘零_sweeeet16 小时前
击穿 MySQL 性能天花板:InnoDB Buffer Pool 核心架构、LRU 优化与生产调优全解
数据库·mysql
一叶飘零_sweeeet16 小时前
MySQL InnoDB 锁机制全解:行锁 / 表锁 / 间隙锁 / 临键锁底层逻辑与死锁避坑指南
数据库·mysql
D4c-lovetrain16 小时前
linux个人心得23 (mysql②)
数据库·mysql
Chasing Aurora18 小时前
整理常用的开发工具使用问题和小贴士(二)——软件和浏览器
redis·python·mysql·maven
仲芒18 小时前
[24年单独笔记] MySQL 引擎架构
笔记·mysql·架构
ChatInfo18 小时前
Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模
数据库·人工智能·mysql
SPC的存折18 小时前
6、MySQL设置TLS加密访问
linux·运维·服务器·数据库·mysql