近道:クイックな検索と置換
最も効果的な解決策は、.sqlファイル内の互換性のない照合順序(collation)文字列を、古いサーバーが実際に認識できるバージョンに置換することです。
- コードエディタやコマンドラインツールを使用して、SQLダンプファイルを開きます。
utf8mb4_0900_ai_ciのすべてのインスタンスを検索し、それらをutf8mb4_unicode_ciに置換します。utf8mb4_0900_as_ciも検索し、同様にutf8mb4_unicode_ciに置換します。- ファイルを保存し、インポート処理を再開します。
なぜこのエラーが発生するのか?
バージョン8.0のリリースに伴い、MySQLはデフォルトの文字セットを utf8mb4 に、デフォルトの照合順序を utf8mb4_0900_ai_ci に更新しました。「0900」はUnicode照合アルゴリズム(UCA)9.0.0を指します。「ai」は、ソートにおいてアクセントを区別しない(accent-insensitive)ことを示しています。
MySQL 5.7のようなレガシーバージョンは、これらの標準が策定される数年前に構築されました。そのため、「0900」の命令を理解するためのライブラリファイルが存在しません。エクスポートファイルが古いサーバーに対し、これらの新しいルールを使用してテーブルを作成するように指示すると、サーバーは処理を断念し、Error 1273をスローします。
3つの解決方法
方法1:コマンドラインを使用する(大容量ファイルに最適)
2GBのSQLダンプファイルを標準的なテキストエディタで開こうとすると、コンピュータがフリーズする可能性があります。代わりに sed を使用しましょう。これはファイルをメモリにすべて読み込むことなく、一行ずつ処理します。
# 0900照合順序を互換性のあるunicodeバリアントに置換
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' backup.sql
# アクセントを区別するバリアントが存在する場合も対象にする
sed -i 's/utf8mb4_0900_as_ci/utf8mb4_unicode_ci/g' backup.sql
注:macOSを使用している場合、構文が少し異なります:sed -i '' 's/.../.../g' backup.sql。
方法2:VS Code または Notepad++ を使用する
ファイルサイズが50MB以下のように小さい場合は、ビジュアルエディタを使用するのが簡単です。
- VS Code または Notepad++ で
.sqlファイルを開きます。 Ctrl + H(Macの場合はCmd + Option + F)を押して置換ツールを開きます。- 検索:
utf8mb4_0900_ai_ci - 置換:
utf8mb4_unicode_ci - すべて置換 をクリックしてファイルを保存します。
方法3:エクスポート時に対応する
移行元のデータベースにまだアクセスできる場合は、より互換性の高い設定でエクスポートを試みることができます。phpMyAdmin では、「エクスポート」タブに移動し「詳細」を選択します。「フォーマット特有のオプション」にある「出力の互換性を最大化するデータベースシステムまたは古いMySQLサーバー」というドロップダウンを探します。MYSQL40 を選択するのが一般的なテクニックですが、MySQL 5.7への移行においては、手動での文字列置換が依然として最も確実な方法です。
動作確認
ファイルを修正した後、インポートコマンドを再度実行します:
mysql -u username -p database_name < backup.sql
完了したら、MySQLコンソールにログインしてテーブルを確認します。SHOW TABLE STATUS; を実行し、Collation 列を確認してください。utf8mb4_unicode_ci と表示されているはずです。最後に、サイトを閲覧して、絵文字や é、ñ などの特殊文字が正しく表示されているか確認してください。
さらに古いバージョンに関する注意
非常に古いサーバー(MySQL 5.5.3以前)に移行する場合、utf8mb4 自体が機能しません。そのような稀なケースでは、utf8mb4 を utf8 に、utf8mb4_unicode_ci を utf8_unicode_ci に置換する必要があります。ただし、ほとんどの現代的なホスティング環境においては、utf8mb4_unicode_ci が最も安全で互換性の高い選択肢です。

