カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

MySQL 既存テーブルの文字コードをutf8mb4に変換する

この記事は最終更新日から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_ciutf8mb4の組み合わせが出てくれば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,413 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です