MySQL 字段扩容遇到的字符集问题
柯苏远写于2024年3月24日11点30分
背景
线上一张表的某个字段给的范围太小了,需要进行扩容。
扩容过程 & 遇到的问题
编写好sql之后,提交给dba审核,dba审核也通过了,然后确定执行。 结果sql执行报错了,错误,内容如下:
SQL 错误 [1366] [HY000]: Incorrect string value: '\xE6\x9F\xAF\xE8\x8B\x8F...' for column 'name' at row 4
经过一番了解,是因为这个字段的字符集是utf8mb4的,但是我在扩容的时候没有指定之前的字符集,所以导致这个字段的字符集会用这个表的默认字符集,但是表的字符集并不能兼容这个字段里当前已经存在的内容,所以导致了这个问题。
解决方案
查看这个表原先的字符集,然后在扩容的sql中指定字符集,这样就能完成扩容了。
alter talbe table_name modify field_name varchar(300) character set utf8mb4;
本地复现这个问题
- 创建一张表,表的字符集用拉丁,里面的name字段用utf8mb4
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) CHARACTER SET utf8mb4
) ENGINE = InnoDB CHARACTER SET = latin1;
- 往这个表插入数据
insert into user(name) values('peter'),('tom'),('albert'),('柯苏远');
- 将字段扩容成varchar(3000)
alter table user modify name varchar(3000);
发现报错了:
SQL 错误 [1366] [HY000]: Incorrect string value: '\xE6\x9F\xAF\xE8\x8B\x8F...' for column 'name' at row 4
此时将扩容sql指定下之前的字符集utf8mb4即可完成扩容,具体sql如下:
alter table user modify name varchar(3000) character set utf8mb4;
总结
我们在实际生产中如果需要将某个字段进行扩容的话,在编写sql的时候一定要指定这个字段之前的字符集,不然可能会产生不必要的麻烦。