utf8がutf8mb4の実際の戦闘チュートリアルに変更されました

序文:

MySQLでは、システムは多くの文字セットをサポートしており、異なる文字セット間でわずかな違いがあります。現在、最も一般的に使用されている文字セットはutf8とutf8mb4です。utf8と比較して、utf8mb4は絵文字式の保存をサポートしており、幅広い用途があります。この記事では、utf8をutf8mb4文字セットに変更する方法を紹介します。

1.utf8およびutf8mb4文字セットの概要

文字(文字)は、国別文字、句読点、グラフィック記号、数字など、さまざまな文字や記号の総称です。文字セット(文字セット)は、複数の文字のコレクションです。

MySQLの文字セットは、サーバーレベル、データベースレベル、テーブルレベル、列レベルの4つのレベルで機能します。サーバーレベルの比較ルールは、character_set_serverパラメーターによって制御されます。データベース、テーブル、または列の作成時に文字セットが明示的に指定されていない場合、前のレベルの文字セットが継承されます。

MySQL 5.7以前のデフォルトの文字セットはlatin1であり、MySQL8.0のデフォルトの文字セットはutf8mb4です。ただし、latin1を使用すると文字が文字化けしやすいため、utf8とutf8mb4が最も広く使用されています。utf8は、実際にはutf8mb3のエイリアスであり、文字を表すために1〜3バイトのみを使用します。utf8mb4は、1〜4バイトを使用して文字を表し、より多くの絵文字式や新しいUnicode文字を格納できます。utf8mb4はutf8と互換性があり、utf8文字セットのスーパーセットであるutf8よりも多くの文字を表すことができます。そのため、特に絵文字ストレージが必要な場合は、データベースの文字セットをutf8mb4に設定することを提案する新しいビジネスもあります。

2.文字セットメソッドを変更します

現在のインターネットビジネスでは、絵文字ストレージの要件がますます増えています。たとえば、ニックネーム、コメントコンテンツなどは絵文字をサポートする必要があります。このとき、データベースフィールドでutf8文字セットを使用すると、次のエラーが報告され
ますjava.sql.SQLException :文字列値が正しくありません:列の「\ xF0 \ x9F \ x92 \ x95 \ xF0 \ x9F ...」…………

ビジネスニーズのために、データベースの文字セットをutf8mb4に変更する必要があります。幸い、utf8mb4はutf8のスーパーセットです。エンコーディングをutf8mb4に変更する以外に、他の変換は必要ありません。変更方法について簡単に説明します。

システムパラメータの変更

後で作成されるライブラリテーブルのデフォルトの文字セットがutf8mb4になるように、システム文字セットパラメータを最初に変更する必要があります。構成ファイルを見つけて、次のパラメーターを追加または変更します。

vi /etc/my.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-character-set-client-handshake
#忽略应用连接自己设置的字符编码,保持与全局设置一致
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

データベースの文字セットを変更する

作成されたデータベースの場合、元のutf8文字セットの場合、次のように変更できます。

# 设置数据库字符集编码
ALTER DATABASE `dbname` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 示例
mysql> show create database testdb;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter database `testdb` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> show create database testdb;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

テーブルとフィールドの文字セットを変更する

同様に、作成されたテーブルの場合、グローバルおよびデータベースの文字セットを変更しても、元のテーブルおよびフィールドの文字セットには影響しません。元のutf8テーブルは次のように変更できます。

# 修改表字符集
alter table `tb_name` default character set utf8mb4;

# 修改某字段字符集
alter table `tb_name` modify col_name varchar(20) character set utf8mb4;

# 同时修改表及字段字符集
alter table `tb_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 如果某个库里面表比较多 可以拼接出要执行的批量修改语句
SELECT
    CONCAT( 'ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;' ) 
FROM
    information_schema.`TABLES` 
WHERE
    TABLE_SCHEMA = 'testdb';

3.いくつかの提案

変更方法は非常に簡単なようですが、実稼働環境では特に注意が必要です。特にフィールドの文字セットを変更すると、書き込み操作を防ぐためにロックされます。また、大きなテーブルの実行は非常に遅く、オンラインビジネスに影響を与える可能性があります。

データベースが比較的小さい場合、上記の方法は大きな問題にはなりません。オンライン環境の場合、文字セットを変更する場合は、評価を行う必要があります。ビジネスのピークの低い時期に変更を停止し、変更する前にバックアップする必要があります。ダウンタイムがない場合は、最初にスタンバイデータベースで変更してから、アクティブとスタンバイを切り替えることを検討できますが、これはさらに面倒です。

可能であれば、空のインスタンスを準備し、最初にテーブル構造をインポートし、それをutf8mb4文字セットに変更してから、データをインポートすることもできます。これも方法ですが、シャットダウンと切り替えが必要になる場合もあります。

おすすめ

転載: blog.51cto.com/10814168/2571966