web-dev-qa-db-ja.com

文字セットutf8mb4のデフォルトの照合をutf8mb4_unicode_ciに変更

文字セットまたは照合順序を指定せずにデータベースを作成すると、サーバーのデフォルトが使用されます(期待どおり)。

MariaDB [(none)]> SHOW VARIABLES LIKE '%_server' ;
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| character_set_server | utf8mb4            |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+

MariaDB [(none)]> CREATE DATABASE `test-without-charset` ;
MariaDB [(none)]> SELECT `DEFAULT_COLLATION_NAME` FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` LIKE 'test-without-charset';
+------------------------+
| DEFAULT_COLLATION_NAME |
+------------------------+
| utf8mb4_unicode_ci     |
+------------------------+

ただし、CREATE DATABASE- query内で文字セットを指定すると、デフォルトの照合順序はutf8mb4_general_ciに変更されます。

MariaDB [(none)]> CREATE DATABASE `test-with-charset` CHARACTER SET utf8mb4 ;
MariaDB [(none)]> SELECT `DEFAULT_COLLATION_NAME` FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` LIKE 'test-with-charset';
+------------------------+
| DEFAULT_COLLATION_NAME |
+------------------------+
| utf8mb4_general_ci     |
+------------------------+

私はすでにそれを見つけました( mysql-manual

COLLATEなしでCHARACTER SET charset_nameが指定されている場合、文字セットcharset_nameとそのデフォルトの照合が使用されます。各文字セットのデフォルトの照合を表示するには、SHOW CHARACTER SETステートメントを使用するか、INFORMATION_SCHEMA CHARACTER_SETSテーブルをクエリします。

そして実際にutf8mb4_general_ciが表示されているため、ルールに従っています

MariaDB [(none)]> SHOW CHARACTER SET LIKE 'utf8mb4';
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |
+---------+---------------+--------------------+--------+

だから私の質問は:このデフォルトの照合順序を文字セットutf8mb4に変更するにはどうすればよいですか。この動作を変更するために変更できる構成ファイルはありますか?私はこれら2つが一貫していることを本当に望んでいます。

もちろん、Googleで関連性のあるものを見つけようとしましたが、collation_server-設定を変更するだけで見つけることができます。

サーバーのバージョン:10.3.15-MariaDB-log MariaDBサーバー

5

DEFAULTを変更する方法はないと思います。

とにかく、それ以降のUnicode標準に基づくutf8mb4_unicode_520_ciを使用することをお勧めします。

すべての接続とCHARACTER SETCREATE TABLEsCOLLATIONを指定する習慣を身に付けてください。 MySQLとMariaDBは、latin1_swedish_ciからutf8mb4_0900_ai_ciに徐々に変更されています。 MariaDBはまだありませんが、すぐに動くと思います。そして、「900」はおそらく最後のUnicode標準ではありません。

文字セットと照合順序を明示的に指定することにより、古いペアであっても、制御と一貫性を維持できます。

妥協...

ただし、CREATE DATABASEの文字セットと照合順序。次に、作成されたすべてのテーブルなし特定の設定がそれらの設定を継承します。そして、そのテーブル内の列はテーブルの設定を継承します。

4
Rick James

オプション1

  1. MySQL 8.0.11以降を使用している場合(それがMariaDB 10.3.15とどのように等しいかわからない)、および
  2. utf8mb4_0900_ai_ciの代わりにutf8mb4_unicode_ciを使用しても問題ない場合

次に、サーバーシステム変数 @@ default_collat​​ion_for_utf8mb4 —が8.0.11で追加されたようですが、有効な値は次のとおりです。

  • utf8mb4_general_ci
  • utf8mb4_0900_ai_ci

ただし、utf8mb4_general_ciではなくutf8mb4utf8mb4_0900_ai_ciのデフォルトの照合順序が表示される場合は、この新しいシステム変数がないと思われます。

オプション2

ドキュメントには、独自のUCA照合を定義するメカニズムが示されていますが、これを使用してデフォルトをオーバーライドできるかどうかは不明です。私はそれをテストすることはできませんが、調べる価値はあります:

これらすべてをまとめると、次のmightが機能します(ただし、テストする方法はありません)。

<charset name="utf8mb4">
  <family>Unicode</family>
  <description>UTF-8 MB4 Unicode</description>
  <collation name="utf8mb4_unicode_ci" id="224">
    <flag>primary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_general_ci" id="45">
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_bin"     id="46">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_unicode_520_ci"     id="246">
    <flag>compiled</flag>
  </collation>
</charset>

今、ドキュメントは述べています:

照合ごとに一意のID番号を割り当てる必要があります。 1024から2047までのIDの範囲は、ユーザー定義の照合用に予約されています。現在使用されている照合IDの最大値を見つけるには、次のクエリを使用します。

     SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;

ただし、実際のIDを使用したのは、基本照合から始めて新しいルールを追加するのではなく、デフォルトを変更するだけであるという考えです。ここでIDを見つけました。

https://github.com/mysql/mysql-server/blob/8.0/mysql-test/suite/engines/funcs/r/db_alter_collat​​e_ascii.result

オプション3

他のすべてが失敗した場合、私はこの質問を次のMySQLフォーラムに投稿します。

MySQLフォーラム:文字セット、照合順序、Unicode

1
Solomon Rutzky