首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL如何确定何时显示显式字符集和排序规则值?

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

Stack Overflow用户
提问于 2021-05-24 22:22:17
回答 1查看 293关注 0票数 3

我的理解是,字段级字符集和排序规则是在创建列时确定的。因此,我不明白为什么以下内容会在SHOW CREATE TABLE中产生不同的输出。由于text_col2的显式值与表的默认值相同,这些值不应该“隐藏”在SHOW CREATE TABLE输出中,就像用于text_col1那样

此外,我在INFORMATION_SCHEMA表中找不到任何东西来显示这两列是如何被不同定义的。MySQL是如何/为什么决定这一点的?

代码语言:javascript
复制
> 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时,它们是不同的

代码语言:javascript
复制
> 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

只有当排序规则不是给定字符集的主排序规则或显式分配时,字符串类型的

/*才会转储排序规则名称。*/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67679576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档