技術共有|MySQL 8.0:文字セットをutf 8からutf 8 mb 4に変換


作者:胡呈清
MySQL 8.0ドキュメントを整理すると、デフォルトの文字セットがlatin 1からutf 8 mb 4に変更されました.以前、文字セット変換ドキュメントを整理してMySQL 8.0にアップグレードすると、文字セット変換の需要があるかもしれないことを思い出して、ここでちょうど共有します.
当時の需要背景は、一部のシステムで使用されていた文字セットがutf 8だったが、utf 8は最大3バイトの文字しか保存できず、4バイトの辺鄙な文字や表情記号を保存できないため、utf 8 mb 4に移行しようとした.
移行シナリオ1
1.新しいデータベース・インスタンスを準備し、次のパラメータを変更します.
[mysqld]
## Character Settings
init_connect='SET NAMES utf8mb4'
#            , super      
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
#         ,            ,   utf8mb4_bin
skip-character-set-client-handshake
#               ,         
## Innodb Settings
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = ON
#           3072(       767  ,    varchar(255)         ,  255*4  767)

2.アプリケーションを停止し、観察し、データの書き込みがないことを確認する
GTIDまたはbinlog positionが変化しなければ書き込みがないことはshow master statusで観察できます.
3.データのエクスポート
表の構造を先に示します.
mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql

データのエクスポート後:
mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --database testdb > /backup/testdata.sql

4.テーブル作成文の変更
エクスポートされたテーブル構造ファイルを変更し、テーブル、カラム定義のutf 8をutf 8 mb 4に変更します.
5.データのインポート
テーブル構造に先導:
mysql -u -p testdb < /backup/testdb.sql

後にデータをインポート:
mysql -u -p testdb < /backup/testdata.sql

6.建設ユーザー
古い環境のデータベース・ユーザーを検出し、新しいデータベースで作成
7.新しいデータベースポートを修正し、アプリケーションを起動してテストする
古いデータベースを閉じ、新しいデータベースポートを変更して再起動し、アプリケーションを開始します.
移行シナリオ2
1.表の文字コードを変更すると表がロックされますので、先に適用を中止することをお勧めします.
2.mysqlを停止し、データディレクトリをバックアップします(他の方法で完全に準備することもできます)
3.プロファイルの変更、データベースの再起動
[mysqld]
## Character Settings
init_connect='SET NAMES utf8mb4'
#            , super      
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
#         ,            ,   utf8mb4_bin
skip-character-set-client-handshake
#               ,         
## Innodb Settings
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = ON
#           3072(       767  ,    varchar(255)          ,  255*4  767)

4.フィールド、変更ライブラリ、およびテーブル構造を含むすべてのテーブル構造を表示します.フィールドに定義文字符号化がある場合、フィールド属性も変更する必要がある場合、sql文は次のようになります.
表の照合ルールを変更するには、次の手順に従います.
alter table t convert to character set utf8mb4;

影響:全表をコピーし、速度が遅く、ロックがかかり、書き込み操作がブロックされます.
フィールドの照合ルールを変更します(utfmb 4は1文字あたり4バイトです.フィールドタイプの最大バイト数と文字長の関係に注意してください).
alter table t modify a char CHARACTER SET utf8mb4;

影響:全表をコピーし、速度が遅く、ロックがかかり、書き込み操作がブロックされます.
Databaseの照合ルールを変更するには、次の手順に従います.
alter database sbtest CHARACTER SET utf8mb4;

影響:メタデータを変更するだけで、高速
5.JDBC url haracterEncoding=utf-8を修正