我的理解是,字段级字符集和排序规则是在创建列时确定的。因此,我不明白为什么以下内容会在SHOW CREATE TABLE中产生不同的输出。由于text_col2的显式值与表的默认值相同,这些值不应该“隐藏”在SHOW CREATE TABLE输出中,就像用于text_col1那样
此外,我在INFORMATION_SCHEMA表中找不到任何东西来显示这两列是如何被不同定义的。MySQL是如何/为什么决定这一点的?
> CREATE TABLE foo
(
text_col1 varchar(64),
text_col2 varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
> show create table foo;
CREATE TABLE `foo` (
`text_col1` varchar(64) DEFAULT NULL,
`text_col2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
> select COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME from information_schema.COLUMNS WHERE TABLE_NAME = 'foo';
+-------------+--------------------+--------------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME |
+-------------+--------------------+--------------------+
| text_col1 | utf8mb4 | utf8mb4_0900_ai_ci |
| text_col2 | utf8mb4 | utf8mb4_0900_ai_ci |
+-------------+--------------------+--------------------+为什么MySQL显示的是text_col2的显式值而不是text_col1
这是另一个例子。如果我将表的默认字符集转换为utf8,那么两列在SHOW CREATE TABLE中都有相同的定义。但是当我切换回utf8mb4时,它们是不同的
> ALTER TABLE foo CHARACTER SET utf8;
> show create table foo;
CREATE TABLE `foo` (
`text_col1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`text_col2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- Change back
> ALTER TABLE foo CHARACTER SET utf8mb4;
> show create table foo;
CREATE TABLE `foo` (
`text_col1` varchar(64) DEFAULT NULL,
`text_col2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ciMySQL在哪里/如何确定一个是显式的还是隐式的?,以及这对功能有什么影响?
这是MySQL 8.0.23
发布于 2021-05-24 22:46:58
代码表明,它有一些方法可以跟踪何时将字符集显式地分配给列。它没有出现在information_schema中,但不知怎么的,它一直在跟踪它。
https://github.com/mysql/mysql-server/blob/8.0/sql/sql_show.cc#L1975-L1976
只有当字段字符集与表字符集相同或被显式分配时,
/*用于字符串类型转储字符集名称。*/
编辑:该注释应该是:"...if字段字符集是而不是,与.“
https://github.com/mysql/mysql-server/blob/8.0/sql/sql_show.cc#L1983-L1987
只有当排序规则不是给定字符集的主排序规则或显式分配时,字符串类型的
/*才会转储排序规则名称。*/
https://stackoverflow.com/questions/67679576
复制相似问题