确定MySQL中的默认数据库charset和collat​​ion

时间:2017-07-31 11:37:51

标签: mysql character-encoding collation

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

以下是:

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

与以下示例相同?

select @@character_set_database, @@collation_database

1 个答案:

答案 0 :(得分:1)

根据文件:

  

character_set_database

     

...

     

默认使用的字符集   数据库。每当默认数据库时,服务器都会设置此变量   变化。如果没有默认数据库,则变量具有相同的值   值为character_set_server

     

...

  

collation_database

     

...

     

默认数据库使用的排序规则。该   每当默认数据库更改时,server都会设置此变量。如果   没有默认数据库,该变量具有相同的值   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)