データベース文字セットについて

バージョン9.0.1のSystem&Settings / Environment / Database character Set が
Nothing selectedになっています.
ちなみにバージョン5.8ではその設定がutf8mb4_unicode_ciになっていました.

試しに9.0.1のDatabase character Set をutf8mb4_unicode_ci相当と思われるものに変更したところ, それまで作成した日本語のページがすべて文字化けしました.

9.0.1の場合はNothing selectedのままにしておいた方がいいのでしょうか?
また, Nothing selectedの場合はOSの文字コード体系がそのまま使われるという理解でよろしいでしょうか?

(参考: OS: RedHat 7.9 ja_JP.UTF-8 データベース: MySQL 5.7 PHP 7.3 Apache 2.4.6)

@pokopon こんにちは。

正しくは utf8mb4_general_ci の接続照合順序を使っていただく必要があります。

おそらく、サーバー側で utf8mb4_unicode_ci で設定しているものの、クライアント側で強制的に utf8mb4_general_ci などになっていて、通信の設定はおかしいですが、正常に通信されているような挙動です。

僕も以前、サーバー側に latin に強制的に設定していて使い続けれていたコンクリのデータベースを直した経験がかなり前にあります。

ちょっと記憶が不確なので、あとで訂正するかもしれませんが、
100% 正しくないと思って、以下を試してもらえますか・

  1. サーバーのデータベースの接続照合順序の設定を確認する
  2. クライアント側の接続照合順序の設定を確認する
  3. MySQLdump で強制的に間違った状態の接続照合順序の設定で Dump する
  4. データベース・サーバー・クライアントの設定を正しい設定に直す or 作り直す
  5. SQL Dump 文の中を全文テキスト置換して接続照合順序に直す
  6. インポートし直す

これで治ったような気がします・・・。

ちょっと試してもらっていいですか?

質問文が誤解を招く表現で申し訳ありません.
文字化けしてしまったコンテンツを直す必要はないのでダンプ,変換,読み直しはやりませんが,collationを調べると
サーバーはlatin1_swedish_ci クライアントはutf8_general_ciがデフォルト設定となっていました(RedHat7.9).
mysql> SHOW VARIABLES LIKE ‘collation%’;
±---------------------±------------------+
| Variable_name | Value |
±---------------------±------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
±---------------------±------------------+

コンクリ9.0.1のDBのテーブルcollationは
utf8mb4_unicode_ciで作られていました.

mysql> SELECT TABLE_NAME,TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA=‘concrete9’;
±----------------------------------------------------±-------------------+
| TABLE_NAME | TABLE_COLLATION |
±----------------------------------------------------±-------------------+
| AreaLayoutColumns | utf8mb4_unicode_ci |
| AreaLayoutCustomColumns | utf8mb4_unicode_ci |
| AreaLayoutPresets | utf8mb4_unicode_ci |

コンクリ5.8のテーブルも調べましたが同じくutf8mb4_unicode_ciでした.
バージョン5.8と9.0.1で System&Settings / Environment / Database character Set の値が一致しない(utf8mb4_unicode_ci vs Nothing selected)のはなぜでしょうか?

1 Like

@pokopon すみません。

まず最初のご質問の返答です。

9.0.1の場合はNothing selectedのままにしておいた方がいいのでしょうか?
また, Nothing selectedの場合はOSの文字コード体系がそのまま使われるという理解でよろしいでしょうか?

のご質問ですね。

バージョン5.8と9.0.1で System&Settings / Environment / Database character Set の値が一致しない(utf8mb4_unicode_ci vs Nothing selected)のはなぜでしょうか?

も。

確かに、Nothing selected になっています。これは実際のDBの情報とは関係ないです。
その管理画面ページの挙動が 8.5.x と 9.0.1 で変わってしまい、今の DB の文字セットを読みに行かなくなっているからだと思います。

その管理画面のページはあくまでも DB の文字セットを変換するためのページなので・・・。

なので、コマンドで調べていただいたものが正解だと思います。

ただ、これはこれで不便なので、もしも 9.0.2 でも継続していれば GitHub の Issue として登録してます。

最新版の 9.0.2 でも治っていなかったので、バグレポートいたしました

(みなさんへ、ぜひ、修正 PR をお願いします!)

ちなみにですが

文字化けしてしまったコンテンツを直す必要はないのでダンプ,変換,読み直しはやりませんが,collationを調べると
サーバーはlatin1_swedish_ci クライアントはutf8_general_ciがデフォルト設定となっていました(RedHat7.9).

わかりました。

ただ、ちょっとまずいですね。

僭越ながら、
僕だったらメンテして文字列を直すかなと思います。

おっしゃる通りに、僕も使いつづけて重要な問題があったというのは特に聞いていません。

僕が問題になったのは
DBの引っ越しやバックアップからの復旧の際でした。

手順を気をつけないと文字化けされたコードになり
最悪、文字化のデータしか残らないなどの事故が起こってしまうリスクが想定できるからです。

こちら、現在の文字セットが選択されていなかった件ですが
今日リリースされた9.1.0 で修正されました

Katz様

ご連絡ありがとうございます.

了解しました. 近日9.1.0にupdateして確かめてみます.

1 Like