絵文字と問題解決のための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でファイルを削除してもスペースが解放されない問題の対処方法

推薦する

MySQL 8.0.22 解凍版インストールチュートリアル(初心者向け)

目次1. リソースのダウンロード2. ソフトウェアを解凍する2.1 場所を選択する2.2 名前を変更...

Nginxはクロスドメインの問題を解決し、サードパーティのページを埋め込む

目次序文困難クロスドメイン定義nginxの機能リバースプロキシ静的と動的の分離達成しようとする最終結...

MySQLデータベース入門:データベースバックアップ操作の詳細な説明

目次1. 単一データベースのバックアップ2. 圧縮バックアップ3. マルチデータベースバックアップ4...

Centos7 に mysql 8.0.13 (rpm) をインストールする詳細なチュートリアル

yum か rpm か? yum によるインストール方法は非常に便利ですが、公式サイトから MySQ...

HTML 背景画像と背景色_PowerNode Java アカデミー

1. HTML 画像 <img> 1. <img> タグとその src 属性...

MySQL での r2dbc の使用に関する詳細な理解

導入MySQL は、私たちが日常業務で使用する非常に一般的なデータベースです。MySQL は現在 O...

Webpack5-react スキャフォールディングをゼロから構築するための実装手順 (ソースコード付き)

目次ウェブパック5公式スタート建築ガイド構築を開始する依存する準備が完了したら、プロジェクトの構築を...

MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明

MySQL Limit はセグメント内のデータベース データをクエリでき、主にページングで使用されま...

Vue が scss (mixin) をグローバルに導入

目次1. ミックスイン.scss 2. 単一ファイルの使用3. グローバルマウント3.1 依存関係の...

mysql ERROR 1045 (28000) 問題の解決方法

私はmysql ERROR 1045に遭遇し、この問題に長い時間を費やしました。私はそれを自分で書き...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

JavaScript を使用して div の位置をドラッグして入れ替える例

1 実施原則これは、DOM 要素の dragstart/ondragover/ondrop イベント...

Docker CPU 制限の実装

1. --cpu=<値> 1) コンテナが使用できるCPUリソースの量を指定しますが、コ...

Nginx と GeoIP モジュールを使用して IP の地域情報を読み取る方法

LinuxにGeoIPをインストールする yum で nginx-module-geoip をインス...

uniapp 要素ノードスタイルの動的変更の詳細な説明

目次1. スタイル属性をバインドして変更するhtml:対応するjs:達成された効果:次に、refを使...