2017-07-31 50 views
1

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

如下:

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

等同于下面的例子?

select @@character_set_database, @@collation_database 

回答

1

根据文档:

character_set_database

...

被默认 数据库使用的字符集。只要默认数据库 更改,服务器就会设置此变量。如果没有默认数据库,则该变量与character_set_server具有相同的 值。

...

collation_database

...

由默认的数据库使用的排序规则。只要默认数据库发生更改, 服务器就会设置此变量。如果 没有默认数据库,则该变量具有与 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) 
相关问题