考虑下表:
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_name
,last_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_ci
是utf8mb4
字符集的默认排序规则!请参阅下面的列说明
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)
感谢。
答案 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语句中。