首页 > 解决方案 > MYSQL8 变量“character_set_database”有什么用?

问题描述

我使用 SQL 'show variables like 'character%';' 显示MySQL变量中的字符集。我找到了一个名为'character_set_database'的变量,我想知道它的用途。我从 MySQL 文档网站获得了一些信息。但我不知道文档上下文中“默认数据库”的含义。关键字“默认数据库”让我对变量“character_set_database”的使用感到困惑。
所以请帮我解释一下关键字' default database '或者直接使用变量' character_set_database '。

mysql网站中关于属性' character_set_database '的描述:

· character_set_database默认数据库


使用的字符集。每当默认数据库更改时,服务器都会设置此变量。如果没有默认数据库,则该变量具有与 character_set_server 相同的值。 从 MySQL 8.0.14 开始,设置此系统变量的会话值是一项受限操作。会话用户必须具有足以设置受限会话变量的权限。请参见第 5.1.9.1 节,“系统变量权限”。 全局 character_set_database 和 collat​​ion_database 系统变量已弃用,并将在 MySQL 的未来版本中删除。





不推荐为会话 character_set_database 和 collat​​ion_database 系统变量分配值,并且分配会产生警告。在 MySQL 的未来版本中,会话变量将变为只读,并且分配将产生错误。仍然可以访问会话变量以确定默认数据库的数据库字符集和排序规则。”

参考链接:character_set_database

标签: mysqlmysql-variables

解决方案


character_set_database变量向您显示当前正在使用的数据库的默认字符集。要选择您使用的默认数据库:

use my_database;

考虑以下示例..

创建两个具有不同字符集的新数据库:

create database test_db1 character set latin1 collate latin1_general_ci;
create database test_db2 character set utf8mb4 collate utf8mb4_unicode_ci;

现在选择一个数据库并查看变量中的character_set_database内容:

use test_db1;
select @@character_set_database;

将返回:'latin1'

use test_db2;
select @@character_set_database;

将返回:'utf8mb4'

当您没有明确指定时,数据库的默认字符集用于新表。例子:

use test_db2;

create table test1 (c text) default character set latin1 collate latin1_general_ci;
show create table test1;

create table test2 (c text);
show create table test2;

第一个结果将是:

CREATE TABLE `test1` (
  `c` text COLLATE latin1_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

如您所见,该表test1正在使用CHARSET=latin1我们已明确设置的 。

第二个结果将是:

CREATE TABLE `test2` (
  `c` text COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

由于我们没有为表指定字符集test2,它使用CHARSET=utf8mb4的是数据库的默认字符集test_db2。并且test_db2目前是默认数据库,因为我们已经选择了use test_db2. 它被称为default database,因为当您在语句中省略数据库前缀时使用它。

例子:

select * from test_db1.test1;

将返回与

use test_db1;
select select * from test1;

推荐阅读