转载自For DBA
前言
针对以下修改表字符集的行为做个记录
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
实验过程
The word DEFAULT is optional. The default character set is the character set that is used if you do not specify the character set for columns that you add to a table later (for example, with ALTER TABLE ... ADD column).
官方文档的意思是修改表的默认字符集行为,只会对后面新增的没有指定字符集的字段有效
我们验证下:
CREATE TABLE `test_default_char` (
`id` int(11) NOT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
往里面插两条记录,分别带emoji和不带emoji
insert into test_default_char values (1,'哈喽');
insert into test_default_char values (2,'哈喽');
修改表字符集,添加新的列
alter table test_default_char CHARACTER SET utf8mb4;
alter table test_default_char add c1 varchar(10);
继续往里面插两条记录,分别带emoji和不带emoji
insert into test_default_char values (3,'哈喽','哈喽');
insert into test_default_char values (4,'哈喽','哈喽');
查看结果
mysql> select * from test_default_char;
+----+---------+------------+
| id | name | c1 |
+----+---------+------------+
| 1 | 哈喽 | NULL |
| 2 | 哈喽? | NULL |
| 3 | 哈喽 | 哈喽 |
| 4 | 哈喽? | 哈喽 |
+----+---------+------------+
4 rows in set (0.00 sec)
我们发现就第四条记录的c1 字段是能看到emoji的
小结
修改表默认字符集的行为,只是针对新加的字段的在没有指定字符集的时候,给该字段确定字符集。老的字段还是原先的字符集,因此在使用中会出现表的字符集明明是utf8mb4的,但是确存不了emoji。因此,推荐不用要这种方式修改表的默认字符集