在 MySQL 中,以编程方式检索字符集和当前数据库整理的最佳方法是什么?
以下是:
SELECT
default_character_set_name, default_collation_name
FROM
information_schema.SCHEMATA
WHERE
SCHEMA_NAME = SCHEMA()
与以下示例相同?
select @@character_set_database, @@collation_database
答案 0 :(得分:1)
根据文件:
...
默认使用的字符集 数据库。每当默认数据库时,服务器都会设置此变量 变化。如果没有默认数据库,则变量具有相同的值 值为character_set_server。
...
和
...
默认数据库使用的排序规则。该 每当默认数据库更改时,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)