MySQL修改表預設字符集行為

江大白發表於2018-09-10

轉載自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。因此,推薦不用要這種方式修改表的預設字符集


相關文章