gpt4 book ai didi

mysql - MySQL 如何确定何时显示显式字符集和排序规则值?

转载 作者:行者123 更新时间:2023-12-04 03:25:34 25 4
gpt4 key购买 nike

据我了解,字段级字符集和排序规则是在创建列时确定的。所以我很困惑为什么以下内容会在 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_ci

MySQL 在哪里/如何确定显式还是隐式?这对功能有什么影响?

这是 MySQL 8.0.23

最佳答案

代码表明它有一些方法可以跟踪您何时将字符集显式分配给列。这不会显示在 information_schema 中,但它会以某种方式跟踪它。

https://github.com/mysql/mysql-server/blob/8.0/sql/sql_show.cc#L1975-L1976

/*
For string types dump charset name only if field charset is same as
table charset or was explicitly assigned.
*/

编辑:该评论应为“...如果字段字符集与...相同”

https://github.com/mysql/mysql-server/blob/8.0/sql/sql_show.cc#L1983-L1987

/*
For string types dump collation name only if
collation is not primary for the given charset
or was explicitly assigned.
*/

关于mysql - MySQL 如何确定何时显示显式字符集和排序规则值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67679576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com