TL;DR
@mita2さん のブログを見て、そういえばこんなのMySQL Server側にもあったなと思ったので書いてみた
CREATE {DATABASE|TABLE}
でCHARSET
だけ指定してCOLLATE
を明示しないとcollation_server
ではなくてdefault_collation_for_utf8mb4
の方が使われる
CREATE DATABASE
の時にCHARSETやCOLLATEを明示したりしなかったりする場合(指定するCOLLATEとCHARSETはちゃんと対応している前提で)、
CHARSET指定 | COLLATE指定 | 実際に使われるCOLLATE |
---|---|---|
していない | していない | (その時点の)collation_server |
していない | している | COLLATEで指定した値 |
している | していない | (その時点の)default_collation_for_utf8mb4 |
している | している | COLLATEで指定した値 |
同じく CREATE TABLE
の場合は
CHARSET指定 | COLLATE指定 | 実際に使われるCOLLATE |
---|---|---|
していない | していない | (その時点の)スキーマのCOLLATE |
していない | している | COLLATEで指定した値 |
している | していない | (その時点の)default_collation_for_utf8mb4 |
している | している | COLLATEで指定した値 |
【2024/08/22 09:49】 更にカラムは
CHARSET指定 | COLLATE指定 | 実際に使われるCOLLATE |
---|---|---|
していない | していない | (その時点の)テーブルののCOLLATE |
していない | している | COLLATEで指定した値 |
している | していない | (その時点の)default_collation_for_utf8mb4 |
している | している | COLLATEで指定した値 |
というわけで、「そもそもCOLLATEまで完全指定した方が間違いがない」「どうしても省略したいならスキーマのCOLLATEに注意する」「少なくともCHARSETだけ書いてCOLLATEだけ省略すると意図しないことになる可能性がある」のでした。
mysql80 17> SELECT @@session.default_collation_for_utf8mb4, @@session.character_set_server, @@session.collation_server, @@session.collation_connection;
+-----------------------------------------+--------------------------------+----------------------------+--------------------------------+
| @@session.default_collation_for_utf8mb4 | @@session.character_set_server | @@session.collation_server | @@session.collation_connection |
+-----------------------------------------+--------------------------------+----------------------------+--------------------------------+
| utf8mb4_0900_ai_ci | utf8mb4 | utf8mb4_general_ci | latin1_swedish_ci |
+-----------------------------------------+--------------------------------+----------------------------+--------------------------------+
1 row in set (0.00 sec)
mysql80 17> CREATE DATABASE no_specified;
Query OK, 1 row affected (0.01 sec)
mysql80 17> SHOW CREATE DATABASE no_specified;
+--------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------+
| no_specified | CREATE DATABASE `no_specified` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql80 17> CREATE DATABASE only_charset_specified CHARSET utf8mb4;
Query OK, 1 row affected (0.01 sec)
mysql80 17> SHOW CREATE DATABASE only_charset_specified;
+------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| only_charset_specified | CREATE DATABASE `only_charset_specified` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql80 17> CREATE DATABASE fully_specified CHARSET utf8mb4 COLLATE utf8mb4_0900_bin;
Query OK, 1 row affected (0.01 sec)
mysql80 17> SHOW CREATE DATABASE fully_specified;
+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| fully_specified | CREATE DATABASE `fully_specified` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql80 17> use fully_specified
Database changed
mysql80 17> CREATE TABLE no_specified_table_and_column (val varchar(32));
Query OK, 0 rows affected (0.03 sec)
mysql80 17> SHOW CREATE TABLE no_specified_table_and_column\G
*************************** 1. row ***************************
Table: no_specified_table_and_column
Create Table: CREATE TABLE `no_specified_table_and_column` (
`val` varchar(32) COLLATE utf8mb4_0900_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin
1 row in set (0.00 sec)
mysql80 17> CREATE TABLE specified_table_and_no_specified_column (val varchar(32)) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.02 sec)
mysql80 17> SHOW CREATE TABLE specified_table_and_no_specified_column\G
*************************** 1. row ***************************
Table: specified_table_and_no_specified_column
Create Table: CREATE TABLE `specified_table_and_no_specified_column` (
`val` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
mysql80 17> CREATE TABLE specified_only_charset_table_and_no_specified_column (val varchar(32)) CHARSET utf8mb4;
Query OK, 0 rows affected (0.02 sec)
mysql80 17> SHOW CREATE TABLE specified_only_charset_table_and_no_specified_column\G
*************************** 1. row ***************************
Table: specified_only_charset_table_and_no_specified_column
Create Table: CREATE TABLE `specified_only_charset_table_and_no_specified_column` (
`val` varchar(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql80 17> CREATE TABLE specified_table_and_specified_column (val varchar(32) CHARSET utf8mb4 COLLATE utf8mb4_ja_0900_as_cs) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.02 sec)
mysql80 17> SHOW CREATE TABLE specified_table_and_specified_column\G
*************************** 1. row ***************************
Table: specified_table_and_specified_column
Create Table: CREATE TABLE `specified_table_and_specified_column` (
`val` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_ja_0900_as_cs DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
mysql80 17> CREATE TABLE specified_table_and_specified_only_charset_column (val varchar(32) CHARSET utf8mb4) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.02 sec)
mysql80 17> SHOW CREATE TABLE specified_table_and_specified_only_charset_column\G
*************************** 1. row ***************************
Table: specified_table_and_specified_only_charset_column
Create Table: CREATE TABLE `specified_table_and_specified_only_charset_column` (
`val` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
mysql80 17> CREATE TABLE specified_only_charset_table_and_specified_only_charset_column (val varchar(32) CHARSET utf8mb4) CHARSET utf8mb4;
Query OK, 0 rows affected (0.02 sec)
mysql80 17> SHOW CREATE TABLE specified_only_charset_table_and_specified_only_charset_column\G
*************************** 1. row ***************************
Table: specified_only_charset_table_and_specified_only_charset_column
Create Table: CREATE TABLE `specified_only_charset_table_and_specified_only_charset_column` (
`val` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
0 件のコメント :
コメントを投稿