- MySQL
- 2023-01-06
この記事は最終更新日から1年以上経過しています。
MySQLのテーブルで文字コードutf8とutf8mb4が混在するシステムをutf8mb4に統一する機会がありました。
そんな時に文字コードや照合順序を確認する方法、変換する方法です。
MySQL:5.7
データベースの文字コードと照合順序を確認する
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'データベース名';
テーブルの文字コードと照合順序を確認する
SELECT TABLE_NAME, TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'データベース名';
カラムの文字コードと照合順序を確認する
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'テーブル名';
利用できる照合順序を確認する
文字コードと利用できる照合順序の組み合わせを確認します。
SELECT COLLATION_NAME, CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY WHERE COLLATION_NAME = 'utf8mb4_general_ci';
今回はutf8mb4_general_ci
とutf8mb4
の組み合わせが出てくればOKです。
データベースの文字コードを変更する
ALTER DATABASE データベース名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
テーブル内の全ての文字カラムを変換する
テーブルのデフォルト文字コードと、カラムの文字コードを分けて一括で変換できます。
ALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
utf8からutf8mb4に変換する際の注意点
utf8は1文字3バイト、utf8mb4は1文字4バイトとなるため文字カラムについて自動で型が変更される場合があります。
- text型がmediumtext型に変換されます。
- innodb_file_formatがBarracudaでない場合
varchar(255)にインデックスがあると767バイトを超えてしまうためエラーになる。
インデックスキーの最大長が767バイトであるためです。
5,415 views