确定 MySQL 中的默认数据库字符集和排序规则

Determining the default database charset and collation in MySQL

MySQL中,以编程方式检索当前数据库的字符集和排序规则的最佳方法是什么?

如下:

SELECT 
    default_character_set_name, default_collation_name
FROM
    information_schema.SCHEMATA
WHERE
    SCHEMA_NAME = SCHEMA()

和下面的例子一样吗?

select @@character_set_database, @@collation_database

根据文档:

character_set_database

...

The character set used by the default database. The server sets this variable whenever the default database changes. If there is no default database, the variable has the same value as character_set_server.

...

collation_database

...

The collation used by the default database. The server sets this variable whenever the default database changes. If there is no default database, the variable has the same value as collation_server.

...

两个句子会得到相同的结果:

SELECT 
    default_character_set_name, default_collation_name
FROM
    information_schema.SCHEMATA
WHERE
    SCHEMA_NAME = SCHEMA()

select @@character_set_database, @@collation_database

在以下测试中得到证明:

mysql> DROP DATABASE IF EXISTS `my_database`;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT SCHEMA();
+----------+
| SCHEMA() |
+----------+
| NULL     |
+----------+
1 row in set (0.00 sec)

mysql> SELECT
    ->   @@SESSION.character_set_database,
    ->   @@SESSION.collation_database,
    ->   @@SESSION.character_set_server,
    ->   @@SESSION.collation_server;
+----------------------------------+------------------------------+--------------------------------+----------------------------+
| @@SESSION.character_set_database | @@SESSION.collation_database | @@SESSION.character_set_server | @@SESSION.collation_server |
+----------------------------------+------------------------------+--------------------------------+----------------------------+
| latin1                           | latin1_swedish_ci            | latin1                         | latin1_swedish_ci          |
+----------------------------------+------------------------------+--------------------------------+----------------------------+
1 row in set (0.00 sec)

mysql> CREATE DATABASE IF NOT EXISTS `my_database`
    -> CHARACTER SET utf8mb4
    -> COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT SCHEMA();
+----------+
| SCHEMA() |
+----------+
| NULL     |
+----------+
1 row in set (0.00 sec)

mysql> SELECT
    ->   @@SESSION.character_set_database,
    ->   @@SESSION.collation_database,
    ->   @@SESSION.character_set_server,
    ->   @@SESSION.collation_server;
+----------------------------------+------------------------------+--------------------------------+----------------------------+
| @@SESSION.character_set_database | @@SESSION.collation_database | @@SESSION.character_set_server | @@SESSION.collation_server |
+----------------------------------+------------------------------+--------------------------------+----------------------------+
| latin1                           | latin1_swedish_ci            | latin1                         | latin1_swedish_ci          |
+----------------------------------+------------------------------+--------------------------------+----------------------------+
1 row in set (0.00 sec)

mysql> USE `my_database`;
Database changed

mysql> SELECT SCHEMA();
+-------------+
| SCHEMA()    |
+-------------+
| my_database |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT
    ->   @@SESSION.character_set_database,
    ->   @@SESSION.collation_database,
    ->   @@SESSION.character_set_server,
    ->   @@SESSION.collation_server;
+----------------------------------+------------------------------+--------------------------------+----------------------------+
| @@SESSION.character_set_database | @@SESSION.collation_database | @@SESSION.character_set_server | @@SESSION.collation_server |
+----------------------------------+------------------------------+--------------------------------+----------------------------+
| utf8mb4                          | utf8mb4_general_ci           | latin1                         | latin1_swedish_ci          |
+----------------------------------+------------------------------+--------------------------------+----------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    ->   `DEFAULT_CHARACTER_SET_NAME`,
    ->   `DEFAULT_COLLATION_NAME`
    -> FROM
    ->   `information_schema`.`SCHEMATA`
    -> WHERE
    ->   SCHEMA_NAME = SCHEMA();
+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8mb4                    | utf8mb4_general_ci     |
+----------------------------+------------------------+
1 row in set (0.00 sec)

然而,两个句子的并集不会错:

mysql> USE `my_database`;
Database changed

mysql> SELECT
    ->   `DEFAULT_CHARACTER_SET_NAME`,
    ->   `DEFAULT_COLLATION_NAME`
    -> FROM
    ->   `information_schema`.`SCHEMATA`
    -> WHERE
    ->   SCHEMA_NAME = SCHEMA() AND
    ->   `DEFAULT_CHARACTER_SET_NAME` = @@SESSION.character_set_database AND
    ->   `DEFAULT_COLLATION_NAME` = @@SESSION.collation_database;
+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8mb4                    | utf8mb4_general_ci     |
+----------------------------+------------------------+
1 row in set (0.00 sec)