确定 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
根据文档:
...
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.
...
和
...
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)
在MySQL中,以编程方式检索当前数据库的字符集和排序规则的最佳方法是什么?
如下:
SELECT
default_character_set_name, default_collation_name
FROM
information_schema.SCHEMATA
WHERE
SCHEMA_NAME = SCHEMA()
和下面的例子一样吗?
select @@character_set_database, @@collation_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.
...
和
...
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)