私は普段、開発環境でMySQLのデータベースを作る場合、phpMyAdminで作成しています。簡単で早いですからね。
「新規作成→紹介順序をutf8mb4_unicode_ci選択→作成」でOK!これまで何も疑わずにやってきました。
でも、utf8mb4_unicode_ci選ぶのめんどくない!?ということに気づいてしまいました。これが最初から選択されていればもっと早いはず……ということで考えてみました。
結論
DBの内部文字セットがlatin1
になっていたためです。結論だけ知りたい方は、以下をMySQLの設定ファイルに記載すればOKです。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
すでに[mysqld]
があると思いますので、その中のブロックに2行分追記します。
最初からutf8になっている前提だったので気づきませんでした(PCが新しいものだったので設定を忘れていたようです。)。
これより先は、私の見当外れの考えから結論に至った流れをメモっておきます。
思考の流れも訓練だと思うので、何かの役に立つかもと思い恥をさらしておきます。また、先ほどの2行の設定の違いにも触れたいと思います。
解決までの試行錯誤の流れ
phpMyAdminの設定
最初はphpMyAdmin側の問題かと思い、設定ファイルであるconfig.inc.php
をいじれば解決だなと気軽に取りかかったのが始まりです。
いろいろと調べてみましたが、以下のような設定が効果がありそうです。
$cfg['DefaultConnectionCollation'] = 'utf8mb4_unicode_ci';
$cfg['DefaultCharset'] = 'utf8mb4';
$cfg['ServerDefaultCollation'] = 'utf8mb4_unicode_ci';
しかし効果は無く、指定は削除しました。
強制的にselectedにする
次に、じゃあselectedにすればいいじゃないと、対症療法的な考えが浮かびました。
表示部分のテンプレートtemplates\server\databases\index.twig
をいじれば解決しそうです。
該当ループの部分を以下の様にして、いったんutf8mb4_unicode_ci
が表示されるようになりました(真似しないで下さい)。
{% if charsets is not empty %}
<div class="col-12">
<select lang="en" dir="ltr" name="db_collation" class="form-select" aria-label="{% trans 'Collation' %}">
<option value="">{% trans 'Collation' %}</option>
<option value=""></option>
{% for charset in charsets %}
<optgroup label="{{ charset.name }}" title="{{ charset.description }}">
{% for collation in charset.collations %}
<option value="{{ collation.name }}" title="{{ collation.description }}"
{% if collation.name == 'utf8mb4_unicode_ci' %} selected{% endif %}>
{{- collation.name -}}
</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
</div>
{% endif %}
ですが今さらですが、できあがったHTMLソースを見るとたしかにutf8mb4_unicode_ci
が選択(selected
)されているのですが、latin1_swedish_ci
もselected
されています。
あ……MySQL側の問題かも
とここで思いいたりました。対症療法は成功していますが、こうなると気持ち悪いので修正を戻します。
MySQLの設定確認
phpMyAdminから以下のSQLを投げます。
SHOW VARIABLES LIKE 'character_set_%';
latin1
……でてますね。
SHOW VARIABLES LIKE 'collation%';
これもlatin1_swedish_ci
出てます……。
これでMySQL側の問題であることがほぼ確定しました。
MySQLの設定ファイル修正
ここで冒頭の結論に向かうのですが、まずは以下だけでやってみました。
[mysqld]
character-set-server=utf8mb4
これだけだと以下の様になり、DB制作時のseledcted
が、latin1_swedish_ci
からutf8mb4_general_ci
に変わりました。
あいまい検索など便利な時もあるのでutf8mb4_general_ci
もたまに使いますが、結論として冒頭の通り以下としました。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
これで意図したようになりました!
まとめ
紆余曲折を経て、デフォルトの紹介順序をutf8mb4_unicode_ci
に変更できました。
これで、5秒くらい早くDBを作成できるでしょうか!?本ページの結論だけ実施すれば、5分でできることですから、60回DBを作れば元を取れますね!
私は1時間ほどあれやこれや格闘したので、720回DBを作れば元がとれそうです。……ちょっと元を取れないかもです。
まあ試行錯誤の経験&知識分を得たので、良しとしましょう!
コメント