絵文字と問題解決のためのMySQL/Javaサーバーサポートの詳細な説明

絵文字と問題解決のためのMySQL/Javaサーバーサポートの詳細な説明

この記事では、絵文字用の MySQL Java サーバーのサポートと問題解決方法について説明します。ご参考までに、詳細は以下の通りです。

問題の説明

最下層でキャプチャされたマイクロブログデータはMySQLに保存されます。一部のデータは保存に失敗しました。Tomcatを確認した後、コアエラー情報は次のとおりです。

// 文字セットがサポートされていない場合は例外をスローします
sql.SQLException: 行 1 の列 'CONTENT' の文字列値が正しくありません: '\xF0\x9F\x98\x97\xF0\x9F...'

原因分析

  • MYSQL 5.5より前では、utf8エンコーディングは1〜3バイト、つまりBMP部分のUnicodeエンコーディング領域(基本的に0000〜FFFFの領域)のみをサポートしていました。
  • 絵文字表現は4バイトで、MySQLのutf8エンコーディングは最大3バイトなので、データを挿入することはできません。
  • MySQL 5.5 以降では、4 バイトをサポートできる utf8mb4 エンコーディングが追加されました。つまり、文字は最大 4 文字まで使用できるため、utf8mb4 エンコーディングではより多くの文字セットをサポートできます。
  • したがって、プロジェクトでモバイル製品のユーザーテキストを保存する場合は、DB文字セットをUTF8/GBKなどの従来の文字セットからutf8mb4にアップグレードする必要があります。

【注記】

  • utf8mb4 は utf8 と互換性があり、utf8 よりも多くの文字を表現できます。したがって、DB 文字セットを UTF8 や GBK などの従来の文字セットから utf8mb4 にアップグレードするときに、文字の互換性の問題を心配する必要はありません。

回避策

特別な絵文字をフィルターする

content = content.replaceAll("[\\x{10000}-\\x{10FFFF}]", ""); // 単純で粗雑、人道的ではない

データベース文字セットのアップグレード

1. utf8mb4 でサポートされている MySQL バージョンは 5.5.3 以上です。MySQL がこのバージョンより低い場合は、まずアップグレードしてください。

2. データベース、テーブル、列の文字セットを変更する

3. MySQL 構成ファイル my.cnf (Windows の場合は my.ini) を変更します。my.cnf は通常、etc/mysql/ ディレクトリにあります。見つけたら、次の 3 つの部分に次の内容を追加します。

[クライアント] デフォルトの文字セット = utf8mb4

[mysql] デフォルトの文字セット = utf8mb4

[mysqld]
文字セットクライアントハンドシェイク = FALSE
文字セットサーバー = utf8mb4
照合サーバー = utf8mb4_unicode_ci
init_connect = '名前をutf8mb4に設定'

4. MySQLを再起動して文字セットを確認する

mysql コマンドラインに次のように入力します:

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collat​​ion%';

再起動前の文字セット

再起動後の文字セット

【注記】

  • 次のフィールドはutf8mb4である必要があります
    • 文字セットクライアント
    • 文字セット接続
    • 文字セットデータベース
    • 文字セットの結果
    • 文字セットサーバー

上記の 4 つの手順を完了したら、MySQL クライアント navicat を使用して、絵文字表現 ⛄ を手動でテーブルに追加します。正常に保存できれば、データベースが正常にアップグレードされたことを意味します。

これらの文字セット設定の具体的な違いについては、MySQLの文字セット設定の詳細を参照してください。

5. サーバー側のDB構成ファイルを確認する

// Spring を構成するときに使用するリンクは次のとおりです。
url="jdbc:mysql://localhost:3306/gzhou?allowMultiQueries=true&useUnicode=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&autoReconnectForPools=true&failOverReadOnly=false&maxReconnects=10"
// characterEncoding=utf8mb4 の場合、データを挿入するときにエラー メッセージが表示されます。原因: java.sql.SQLException: サポートされていない文字エンコーディング 'utf8mb4'
// characterEncoding または characterEncoding=utf8 を削除します

絵文字

Android システムでは、Sogou と Baidu の入力方法に絵文字表現が組み込まれています。

【注記】

システム間で絵文字記号に互換性がない場合は、四角形のみが表示されます。

MySQL 関連のコンテンツに興味のある読者は、次のトピックを確認してください: 「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL mysqladmin クライアントの使用の概要
  • MySQL は対応するクライアント プロセスにどのように接続しますか?
  • MySql クライアントが数秒で終了する問題を解決する (my.ini が見つからない)
  • PHP Swoole 非同期 MySQL クライアント実装例
  • Node.js mysqlクライアントが認証プロトコルをサポートしていない問題を解決する
  • mysql8.0.11クライアントがログインできない問題の解決方法
  • NodeJS サーバー開発入門 (Express+MySQL)
  • アプリケーション サーバー用の MySQL 接続プール (高い同時実行性をサポート)
  • MySQLクライアントとサーバーのプロトコルの解釈

<<:  Vueコンポーネントドキュメント生成ツールライブラリのメソッド

>>:  Linuxでファイルを削除してもスペースが解放されない問題の対処方法

推薦する

Navicat を MySQL に接続するときに発生する 2059 エラーの解決方法

最近、Djangoを学習しているときにデータベースを使用する必要があったため、MySQLで使用するた...

MySQL マスタースレーブレプリケーションの詳細な分析

序文: MySQL では、マスター/スレーブ アーキテクチャが最も基本的かつ最も一般的に使用されるア...

Mysql | ワイルドカード(%、_ など)を使用したファジークエリの詳細な説明

ワイルドカードのカテゴリ: %パーセント ワイルドカード: 任意の文字が任意の回数出現できることを示...

CSSの優先度を理解する2つの方法

方法1: 値を追加する公式の説明を見るには MDN にアクセスしてください。優先度はどのように計算さ...

HTML チュートリアル、簡単に学べる HTML 言語 (2)

*******************HTML言語入門(パート2)*****************...

MySQL トランザクション分離レベルの詳細

serializableシリアル化(問題なし)トランザクションは順次実行する必要があります。前のトラ...

Uniapp は DingTalk スキャンコード ログイン サンプル コードを実装します

UniappにはDingTalk認証ログインがないため、この記事ではDingTalk QRコードログ...

JavaScript でネットワーク速度をテストする方法

目次序文ネットワーク速度のフロントエンド判定原理のまとめ1. img を読み込むか Ajax リクエ...

効率的な視覚化Nginxログ表示ツール

目次導入インストール表示フィールドフィルターソートキー導入Rhit は、標準フォルダー (gzip ...

Docker ベースのよく使われる CentOS7 イメージの概要

目次1 Dockerをインストールする2 国内ミラーソースの設定3 中国語環境基本版Centos7イ...

Navicat を仮想マシン MySQL に接続する際によくあるエラーと解決策

質問1 解決するサービスを開始します: service mysqld start; /sbin/ip...

nginx での書き換えジャンプの実装

1. 新旧ドメイン名のジャンプ適用シナリオ: ドメイン名ベースのリダイレクト。会社の古いドメイン名は...

Linuxオンラインソフトウェアgccをオンラインでインストールする方法

Linux オンラインインストール関連コマンド: yum install: すべてインストールyum...

Windows Server 2016 でサービスを展開する方法 (グラフィック チュートリアル)

導入インストールするシステムの数が多い場合、USB フラッシュ ドライブまたは CD を使用した手動...

Mysql一時テーブルの原理と作成方法の分析

この記事は主にMysql一時テーブルの原理と作成方法を紹介します。この記事のサンプルコードは非常に詳...