レオGalleguillos:
実行しているときSHOW CREATE TABLE `my_table`;
、私はそれに気づくCOLLATE utf8mb4_unicode_ci
すべてのために示されているchar
、varchar
とtext
テーブルの列。照合がすでに宣言されているので、これはビットの冗長を思わtable_optionの作成文の一部。
mysql> SHOW CREATE TABLE `my_table`;
| Table | Create Table
| my_table | CREATE TABLE `my_table` (
...
`char_col_1` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`varchar_col_1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`varchar_col_2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`varchar_col_3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`text_col_1` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
...
) ENGINE=InnoDB AUTO_INCREMENT=1816178 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
この動作は、両方のMySQL 5.7とMySQL 8.0、したがって、最も可能性が高いだけでなく、他のバージョンではで顕著です。
この動作は正常で受け入れられるか、テーブル、データベース、またはMySQLインスタンスのいずれかで間違って設定された何かの症状ですか?
照合が個別に任意の特定の列に設定することができるので一方、おそらく明示的に列の照合順序は、テーブルの照合と一致しても、場合によっては任意の曖昧さや仮定を、避けるために、列ごとに照合を表示することをお勧めします?
リック・ジェームス:
あなたは氷山の一角に触れてきました。
- 私はテーブルの上の設定は、文字セットや、コレートなしで定義されている列のためだけのデフォルトだと思います。
- 以下のための同上
ALTER TABLE ADD COLUMN
-は、テーブルのデフォルトから継承します。 - 私は、列の設定が投入されていることを考える
information_schema.COLUMNS
テーブルとそれがで変更されませんALTER TABLE .. MODIFY COLUMN ..
同様に、表の文字セットと照合が継承データベースの定義、およびテーブルが定義されているように凍結されます。
デフォルトについて:
- 古いデフォルトの文字セットでした
latin1
- 現在のデフォルトです
utf8mb4
。これは今までに、将来的に変更することはほとんどありません。 - すべての照合は、1つの文字セットに適用され、文字セット名は、照合名の始まりです。
- 各文字セットは、1つの「デフォルト」の照合を持っている:
latin1_swedish_ci
、utf8_unicode_ci
、utf8mb4_0900_ai_ci
、など - これまでに、変更された場合(特定の文字セット用)はデフォルトの照合は、めったにありません。おそらく唯一の変化は5.7と8.0の間utf8mb4のためになっています?
(より多くのI実験、すべてこの程度少ない特定のI AM。)
ベストプラクティス:常に明示的に設定CHARSET
し、COLLATE
各文字列の列に。
二次的考察:
- 使用
utf8mb4
可能な場合、ほとんどの文字列(VARCHAR
/TEXT
)。 - (Unicodeはそれを改善し続けて)利用可能な最新の照合を使用します。現在
utf8mb4_0900_ai_ci
。 - 使用する
ascii
国コード、POSTAL_CODE、六角など主にこれらの缶を使用-明確にASCIIだけあるもののためにCHAR(..)
- 使用
ascii_general_ci
またはascii_bin
、あなたはケースの折り畳みを必要とするかどうかに応じて。