web-dev-qa-db-ja.com

MySQLとMariaDB:テーブルのCOLLATEとすべての列のCOLLATEですか?

次の表の動作や動作は異なりますか

CREATE TABLE t1 (
  foo char(60) COLLATE utf8_bin,
  bar char(64) COLLATE utf8_bin,
  baz char(80) COLLATE utf8_bin
) DEFAULT CHARSET=utf8;

この表より

CREATE TABLE t2 (
  foo char(60),
  bar char(64),
  baz char(80)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

SHOW CREATE TABLE mysql.dbを実行すると、すべての列(t1のように)とテーブル(t2のように)にマーカーが表示されるため、これを質問します。テーブルを作成するときにDEFAULT COLLATEを追加しません。システムテーブルにこのオプションが設定されているのはなぜですか。

1
Evan Carroll
  1. 現在の形式では、t1t2の動作とパフォーマンスは同じである必要があります。

    および:

  2. CHARSETまたはCOLLATE句を指定しない文字列列が追加された場合:動作とパフォーマンスは異なります。これは、に起因するものです:

    1. t2の新しい列はCHARSET=utf8およびCOLLATE=utf8_binになります(テーブルのデフォルトとして指定されているため)。

    2. t1の新しい列はCHARSET=utf8(テーブルのデフォルトとして指定されているため)になりますが、COLLATE=utf8_general_ciutf8のデフォルトであるため)にもなりますキャラクターセット)

今、私はあなたが質問にそれらを持っているように2つのテーブルを作成しました、そしてそれは以下をもたらしました:

SHOW CREATE TABLE t1;

CREATE TABLE `t1` (
  `foo` char(60) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `bar` char(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `baz` char(80) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

そして:

SHOW CREATE TABLE t2;

CREATE TABLE `t2` (
  `foo` char(60) COLLATE utf8_bin DEFAULT NULL,
  `bar` char(64) COLLATE utf8_bin DEFAULT NULL,
  `baz` char(80) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

CHARACTER SETの保存されたバージョンでCREATE TABLE t1が明示的に宣言された理由はわかりませんが、COLLATECREATE TABLE t2に対してなぜ実行したのかはわかります。送信するとステートメントは、それが処理中に翻訳されるものです。なぜCOLLATEステートメントだけで、CHARACTER SETもしないのですか?これは、1つ以上の照合順序で動作する文字セットが原因である可能性が高いため、文字セットを指定しても照合順序は意味されません。一方、照合は1つの文字セットでのみ機能するため、照合doesを指定すると、文字セットが暗黙指定されます。はい、文字セットにはデフォルトの照合順序がありますが、デフォルトは時間の経過とともに、またはコンテキスト間で変わる可能性があります。はい、テーブルに対して明示的に宣言されたデフォルトがありますが、a)テーブルのデフォルトが順守されていない場合、および/またはb)DDLが列を解析しているときに、DDLが列に関するすべてを知りたい場合はどうなりますか?最初に完全なテーブルDDLを読み取る必要があり、場合によっては戻ってデフォルトを適用する必要があります。 COLLATE句を追加すると、操作が非常に明確で明確になります。

また、 CREATE TABLEステートメントの保持 のドキュメントには次のように記載されています。

すべての仕様とテーブルオプションを含む元のCREATE TABLEステートメントは、テーブルの作成時にMySQLによって保存されます。情報は保持されるため、ALTER TABLEステートメントを使用してストレージエンジン、照合順序、またはその他の設定を変更した場合、指定された元のテーブルオプションが保持されます。これにより、2つのエンジンでサポートされる行形式が異なる場合でも、InnoDBMyISAMのテーブルタイプを変更できます。

これをMariaDB 10.2および10.3に対して db <> fiddle でテストしました。 MySQL 5.6、5.7、8.0。動作はすべて同じでした。

1
Solomon Rutzky

いいえ、私はそれは同じだと思います(他の人が違う答えをしないと仮定します)。 ドキュメントから

テーブルの文字セットと照合順序は、列の文字セットと照合順序が個々の列定義で指定されていない場合、列定義のデフォルト値として使用されます。テーブル文字セットと照合はMySQLの拡張です。標準SQLにはそのようなものはありません。

0
Evan Carroll