ホームページ  >  記事  >  データベース  >  MySQL は絵文字アイコンのストレージをサポートします

MySQL は絵文字アイコンのストレージをサポートします

藏色散人
藏色散人転載
2019-10-28 14:33:292535ブラウズ

MySLQ で UPDATA および INSERT データを使用する場合、データに ?、?、? などの絵文字アイコンが含まれていると、更新または挿入が失敗し、エラーが発生しやすくなります。

Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: 
Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F...' for column 'name' at row

ほぼ崩壊しましたが、幸いなことに、この幽霊の問題は最終的に解決されました。データに示されている理由は、MYSQL 5.5 より前では、UTF8 エンコードは 1 ~ 3 バイトしかサポートしておらず、BMP 部分の Unicode エンコード領域のみをサポートしており、絵文字アイコンはたまたま 4 バイトのエンコードで格納されていたためです。 MYSQL5.5 以降、4 バイトの UTF エンコーディング utf8mb4 がサポートされるようになり、1 文字は最大 4 バイトまで持つことができるため、より多くの文字セットをサポートできるようになります。したがって、この問題を解決するには、すべてのデータベース テーブルの文字エンコーディングを utf8mb4 に変更する必要があります。

推奨: mysql ビデオ チュートリアル

一般的に使用される文字セット

ASCII: 情報交換のための米国標準エンコーディング、英語とその他の西ヨーロッパ言語、シングルバイトエンコーディング、1 文字を表す 7 ビット、合計 128 文字。

GBK: 2 バイト、中国語文字内部コード拡張仕様; 中国語、日本語、韓国語の中国語文字、英語、数字; 2 バイト エンコーディング; 合計 21,003 文字の中国語が含まれており、GB2312 の拡張です。

UTF-8: Unicode 標準の可変長文字エンコーディング。世界中の数十のテキスト システムを含む業界の統一標準である Unicode 標準 (Unicode)。

UTF-8:各文字をエンコードするには 1 ~ 3 バイトを使用します。

utf8mb4: 4 バイトを保存します。絵文字表現は 4 バイトになる可能性があるため、アプリケーション シナリオは絵文字表現を保存するために使用されます。

utf8mb4: MySQL バージョン > 5.5.3。

その他の一般的な文字セット: UTF-32、UTF-16、Big5、latin1

データベース内の文字セットには 2 つのレベルの意味が含まれています

さまざまなテキストのコレクション各国の文字、句読点、図記号、数字などの記号。

文字エンコード方式、つまりバイナリデータと文字の間のマッピング規則。

#システム環境

MySQL 5.7.14

Mac OSX 10.11.6

まずはバックアップ

データをアップグレードする前にサーバー上のすべてのデータをバックアップし、良い習慣を維持し、安全を第一に考えてください。

MySQL のアップグレード

新しいデータベースはここからダウンロードできます

MySQL サーバーを v5.5.3 にアップグレードします。 データベース、テーブル、フィールドを変更する

# 对每一个数据库:
ALTER DATABASE 这里数据库名字 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# 对每一个表:
ALTER TABLE 这里是表名字 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 对每一个字段:
ALTER TABLE 这里是表名字 CHANGE 字段名字 重复字段名字 VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 上面一句或者使用modify来更改
ALTER TABLE 这里是表名字 modify 字段名字 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '';

utf8mb4 は utf8 と完全に下位互換性があり、文字化けやその他の形式のデータ損失はありません。理論的には、心配することなく変更できます。変更が心配な場合は、バックアップからデータを復元し、絵文字互換のストレージの問題はプログラマに任せることができます。保存するときにフィルタリングして、base64 に変換します。それを取得するときに変換して戻しますか? ...データベースを変更する方が便利です。

フィールドとインデックスを確認してください

すべてを utf8mb4 に設定しないでください。これは必要です。フィールドタイプの一部が VARCHAR である場合にのみ、utf8mb4 に設定します。

MySQL 設定ファイルを変更する

ここが最もわかりにくい場所です。Mac osx システムでは /etc/my.cnf が見つかりません。はまったく存在しないため、そのようなファイルを作成して変更する必要があります。

# 进入这个目录,
# 在这个目录下面有个后缀为`.cnf`的文件
cd /usr/local/mysql/support-files/
# 将这个文件复制到`etc`目录中并将名字命名为`my.cnf`
sudo cp my-default.cnf /etc/my.cnf
# 然后编辑`my.cnf`文件,将下面内容复制到里面。
sudo vim /etc/my.cnf

MySQL 設定ファイル (/etc/my.cnf):


[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

MySQL を再起動

再起動の手順は非常に重要です。そうでないと効果がありません。

開始:/usr/local/mysql/support-files/mysql.server start

停止:/usr/local/mysql/support-files/mysql.server stop

Restart:/usr/local/mysql/support-files/mysql.server restart

システムはこの形式で再起動、停止、または開始できます

service mysqld stop
service mysqld start
service mysqld restart

かどうかを確認してくださいset Success

次のコマンドを使用して、設定が成功したかどうかを確認します。

# 登陆MySQL进行查询
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
# 运行上面代码显示下面结果
# +--------------------------+--------------------+
# | Variable_name            | Value              |
# +--------------------------+--------------------+
# | character_set_client     | utf8mb4            |
# | character_set_connection | utf8mb4            |
# | character_set_database   | utf8mb4            |
# | character_set_filesystem | binary             |
# | character_set_results    | utf8mb4            |
# | character_set_server     | utf8mb4            |
# | character_set_system     | utf8               |
# | collation_connection     | utf8mb4_unicode_ci |
# | collation_database       | utf8mb4_unicode_ci |
# | collation_server         | utf8mb4_unicode_ci |
# +--------------------------+--------------------+
# 查看表的情况
mysql>  SHOW FULL COLUMNS  FROM  users_profile;

ここまで到達したということは、成功したことを意味します。おめでとう! ~

テーブルを修復して最適化する

このステップに到達したので、テーブルを修復して最適化する必要はありません。安全のため、まだこの2つのコマンドを実行したので、目的は分かりませんが、メモを兼ねてここに載せておきます。

rree

以上がMySQL は絵文字アイコンのストレージをサポートしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。