mysql 数据库字符集,表字符集 ,列字符集优先级,以及修改表字符集utf8为utf8mb4对之前的数据是否有影响 简记

时间:2024-03-13 14:37:35

myslq 可以设置数据库级别,表级别,列级别 字符集编码;

优先级顺序为:数据库字符集 < 表字符集 < 列字符集;

也就是 上面三个级别 字符集不一致时,以 更小范围的配置为准;

例如:数据库字符集为utf8  表字符集不设置的情况下 会默认 utf8 ,如果表主动设置了编码 utf8mb4;那么表的字符集编码就为utf8MB4;

 

 

由于会有生僻字导致 入库报错后,数据入库失败;所以决定将大部分表数据由utf8 改为utf8mb4 ,开始想到了 两个疑问:

1、将一个表转换编码时,要是表中某个字段长度转后超过了255设置的最大长度,是表编码转换不成功,还是能成功数据会出现异常;2、编码转换后,字节长度变化了,可能导致原来能正常存储255字符的现在没法正常存储,防止部分字段原来可以存数据,现在存储长度变短,无法入库了;

 

后来通过测试得到了答案 - 不影响;

第一点。因 mysql 5.0版本以上,varchar(255),指的是255字符; 最大65532字节; 所以 varchar(255) 这个限制即使改变 字符集,也没有超过最大字节数,所以不会受影响;

第二点:修改表字符集的时候,可以选择对 已存在的数据是否刷新(是否以新的字符集进行存储);或者只对 后来插入的数据生效(已存在的数据不做处理);

语句分别如下:

1修改表的字符集 并刷新之前已存在的数据; 可以看到 修改后已存在的三条记录受到了影响;(如果需要设置 校对规则后面增加 COLLATE 校对规则   即可)

ALTER table table_name CONVERT to CHARACTER set  新的字符集

mysql 数据库字符集,表字符集 ,列字符集优先级,以及修改表字符集utf8为utf8mb4对之前的数据是否有影响 简记

2 修改表的字符集,但不对之前已存在的数据刷新;可以看到 修改后 受影响的行为 0 ;(如果需要设置 校对规则后面增加 COLLATE 校对规则   即可)

ALTER table table_name DEFAULT to CHARACTER set  新的字符集

mysql 数据库字符集,表字符集 ,列字符集优先级,以及修改表字符集utf8为utf8mb4对之前的数据是否有影响 简记