MySQL将列charset重置为默认值

时间:2015-09-23 16:43:12

标签: mysql unicode utf-8 character-encoding collation

考虑下表:

CREATE TABLE `user` (
  `modified_at` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(40) CHARACTER SET utf8mb4 DEFAULT NULL,
  `middle_name` varchar(40) CHARACTER SET utf8mb4 DEFAULT NULL,
  `last_name` varchar(40) CHARACTER SET utf8mb4 DEFAULT NULL,
  `username` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL,
  `active` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

是否可以删除特定于列的字符集,I.E。 first_namelast_name没有列字符集覆盖,以便它采用表级字符集设置?

换句话说,ALTER TABLE语句是什么让表定义变成如下所示?

CREATE TABLE `user` (
  `modified_at` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(40) DEFAULT NULL,
  `middle_name` varchar(40) DEFAULT NULL,
  `last_name` varchar(40) DEFAULT NULL,
  `username` varchar(100) DEFAULT NULL,
  `active` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我已经尝试了

ALTER TABLE user MODIFY first_name varchar(40) DEFAULT NULL

ALTER TABLE user MODIFY first_name varchar(40) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL;

这两个都没有重置/删除列上的charset set overwrite,而是添加了排序规则,因此列看起来像这样first_name varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL

更新

顺便说一句,由于此表具有默认的字符集和默认排序规则,我认为varchar列应该继承表默认排序规则,但它们是 NOT !一旦在列级别上覆盖了字符集,MySQL就会错误地选择覆盖的字符集的默认排序规则,在我的情况下,utf8mb4_general_ciutf8mb4字符集的默认排序规则!请参阅下面的列说明

mysql> SHOW FULL COLUMNS FROM user;
+-----------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field           | Type         | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+-----------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| modified_at     | datetime     | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
| created_at      | datetime     | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
| id              | int(11)      | NULL               | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| first_name      | varchar(40)  | utf8mb4_unicode_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| middle_name     | varchar(40)  | utf8mb4_general_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| last_name       | varchar(40)  | utf8mb4_general_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| username        | varchar(100) | utf8mb4_general_ci | YES  | UNI | NULL    |                | select,insert,update,references |         |
| active          | tinyint(1)   | NULL               | NO   |     | NULL    |                | select,insert,update,references |         |
+-----------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
8 rows in set (0.01 sec)

感谢。

1 个答案:

答案 0 :(得分:0)

好的,我从@PulF指出的WordPress的charset迁移指南链接中获得了一些线索后,我自己想出来了。

答案是否定的,没有默认情况下将列重置为。一旦表具有特定的字符集/整理集,而不是默认的数据库,则整理设置将保留在列中。即。

CREATE TABLE `test_default` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `foo` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 
--
mysql> show create table test_default\G
*************************** 1. row ***************************
       Table: test_default
Create Table: CREATE TABLE `test_default` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `foo` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)

换句话说,COLLATE utf8mb4_unicode_ci将保留列foo,因为它不是utf8mb4字符集的默认排序规则。

此外,如果要将排序规则设置为除utf8mb4_unicode_ci以外的任何排序规则,则该列的COLLATE new_collation_here仍将显示在CREATE TABLE语句中。