MySQL 文字セットの文字化けとその解決方法

MySQL 文字セットの文字化けとその解決方法

序文

文字セットは、一連のシンボルとエンコード規則です。Oracle データベースでも MySQL データベースでも、文字セットの選択に問題があります。データベース作成フェーズで文字セットが正しく選択されていない場合、後で文字セットを置き換える必要がある場合があります。文字セットの置き換えは比較的コストのかかる操作であり、一定のリスクも伴います。したがって、後で不要な調整を行わないように、アプリケーションの開始時にニーズに応じて適切な文字セットを正しく選択することをお勧めします。

実際の戦闘

1. MySQLデータベースをインストールする

2. 文字化けしたコードのデモ

mysql> 'character_set%' のような変数を表示します。
+--------------------------+----------------------------------+
| 変数名 | 値 |
+--------------------------+----------------------------------+
| 文字セットクライアント | utf8 |
| 文字セット接続 | utf8 |
| 文字セットデータベース | utf8 |
| 文字セットファイルシステム | バイナリ |
| 文字セット結果 | utf8 |
| 文字セットサーバー | utf8 |
| 文字セットシステム | utf8 |
| 文字セットディレクトリ | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
セット内の行数は 8 です (0.00 秒)
 
mysql> test.table10 に値 (1,'云中鹤') を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)
 
mysql> test.table10 から * を選択します。
+------+------------+
| ID | 名前 |
+------+------------+
| 1 | 雲の中の鶴|
+------+------------+
セット内の 1 行 (0.00 秒)
 
mysql> 名前を latin1 に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
 
mysql> test.table10 から * を選択します。
+------+-------+
| ID | 名前 |
+------+-------+
| 1 | ??? |
+------+-------+
セット内の 1 行 (0.00 秒)
 
mysql> 'character_set%' のような変数を表示します。
+--------------------------+----------------------------------+
| 変数名 | 値 |
+--------------------------+----------------------------------+
| character_set_client | latin1 #クライアント ソース データで使用される文字セット | character_set_connection | latin1 #接続レイヤーの文字セット | character_set_database | utf8 #現在選択されているデータベースのデフォルトの文字セット | character_set_filesystem | binary   
| character_set_results | latin1 #クエリ結果の文字セット |
| character_set_server | utf8 #デフォルトの内部操作文字セット |
| character_set_system | utf8 #システムメタデータ (フィールド名など) 文字セット | character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
セット内の行数は 8 です (0.00 秒)

文字化けしたコードの解決策

上記のように、set names latin1; は 3 つのパラメータを変更します。クライアント、MySQL 文字セット クライアント、およびテーブル文字セットが完全に一貫している限り、文字化けした文字が表示されないこと保証されます。

方法:

1. mysql コマンドラインモードで set names xxx を実行します。

 mysql> 名前を utf8 に設定します。
 クエリは正常、影響を受けた行は 0 行 (0.01 秒)

2. MySQLにログインする際のデフォルトの文字セットを指定する

 [root@node1 ~]# mysql -S /tmp/mysql.sock4 --defaults-character-set=utf8 #-S は、mysql の複数のインスタンスのソケット ファイルを指定します。
 デフォルトの文字セットを指定するには、--defaults-character-set を使用します。

3. my.cnf でデフォルトの文字セットが指定されていない場合は、/etc/sysconfig/i18n ファイルを変更します。

 vim /etc/sysconfig/i18n
 LANG='zh_CN.UTF-8' #my.cnfが指定されていない場合は、システムの文字セットがデフォルトで使用されます

​ 4. my.cnf ファイルを変更します。次の 2 つのフィールドは任意のフィールドにすることができます。

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

最初の 2 つ 1 と 2 は一時的な解決策であり、最後の 2 つ 3 と 4 は永続的な解決策です。

文字セットを表示

1. システムの現在の文字セット設定を確認し、MySQL にログインして変更後に実行します。変数のみを表示します 'character_set%';

mysql> show variables like 'character_set%';#utf8に変更したので、クライアントの3つのパラメータはすべてutf8です。文字セットは自分で設定できます。
+--------------------------+----------------------------------+
| 変数名 | 値 |
+--------------------------+----------------------------------+
| 文字セットクライアント | utf8 |
| 文字セット接続 | utf8 |
| 文字セットデータベース | utf8 |
| 文字セットファイルシステム | バイナリ |
| 文字セット結果 | utf8 |
| 文字セットサーバー | utf8 |
| 文字セットシステム | utf8 |
| 文字セットディレクトリ | /usr/local/mysql/share/charsets/ |

2. MySQL でよく使用される文字セット。システムでサポートされている文字セットを表示するには、show character set; コマンドを実行します。

mysql> 文字セットを表示します。
+----------+-----------------------------+----------------------+--------+
| 文字セット | 説明 | デフォルトの照合順序 | Maxlen |
+----------+-----------------------------+----------------------+--------+
| big5 | Big5 繁体字中国語 | big5_chinese_ci | 2 |
| dec8 | DEC 西ヨーロッパ | dec8_swedish_ci | 1 |
| cp850 | DOS 西ヨーロッパ | cp850_general_ci | 1 |
| hp8 | HP 西ヨーロッパ | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom ロシア語 | koi8r_general_ci | 1 |
| latin1 | cp1252 西ヨーロッパ | latin1_swedish_ci | 1 | #common | latin2 | ISO 8859-2 中央ヨーロッパ | latin2_general_ci | 1 |
| swe7 | 7 ビット スウェーデン語 | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP 日本語 | ujis_japanese_ci | 3 |
| sjis | Shift-JIS 日本語 | sjis_japanese_ci | 2 |
| ヘブライ語 | ISO 8859-8 ヘブライ語 | hebrew_general_ci | 1 |
| tis620 | TIS620 タイ語 | tis620_thai_ci | 1 |
| euckr | EUC-KR 韓国語 | euckr_korean_ci | 2 |
| koi8u | KOI8-U ウクライナ語 | koi8u_general_ci | 1 |
| gb2312 | GB2312 簡体字中国語 | gb2312_chinese_ci | 2 |
| ギリシャ語 | ISO 8859-7 ギリシャ語 | greek_general_ci | 1 |
| cp1250 | Windows 中央ヨーロッパ | cp1250_general_ci | 1 |
| gbk | GBK 簡体字中国語 | gbk_chinese_ci | 2 | #Common | latin5 | ISO 8859-9 トルコ語 | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 アルメニア語 | armcii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |#Common | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS ロシア語 | cp866_general_ci | 1 |
| keybcs2 | DOS カメニツキ チェコ語-スロバキア語 | keybcs2_general_ci | 1 |
| macce | Mac 中央ヨーロッパ | macce_general_ci | 1 |
| macroman | Mac 西ヨーロッパ | macroman_general_ci | 1 |
| cp852 | DOS 中央ヨーロッパ | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 バルト語 | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | #Common | cp1251 | Windows キリル文字 | cp1251_general_ci | 1 |
| utf16 | UTF-16 ユニコード | utf16_general_ci | 4 |
| cp1256 | Windows アラビア語 | cp1256_general_ci | 1 |
| cp1257 | Windows バルト語 | cp1257_general_ci | 1 |
| utf32 | UTF-32 ユニコード | utf32_general_ci | 4 |
| バイナリ | バイナリ疑似文字セット | バイナリ | 1 |
| geostd8 | GEOSTD8 グルジア語 | geostd8_general_ci | 1 |
| cp932 | Windows 日本語用 SJIS | cp932_japanese_ci | 2 |
| eucjpms | Windows 日本語用 UJIS | eucjpms_japanese_ci | 3 |
+----------+-----------------------------+----------------------+--------+
セット内の行数は 39 です (0.00 秒)

文字セットの選択

1. さまざまなテキストを扱い、異なる言語を使用する国や地域に公開する場合は、Unicode を選択します。 mysql の場合は utf-8 を使用します。

2. 中国語のみが必要で、データ量が多く、パフォーマンス要件が高い場合は、gbk を選択します。

3. モバイルIoTサービスを処理するには、utf8mb4を選択します。

アプリケーション要件を完全に満たすことができる限り、小さな文字セットを使用することをお勧めします。文字セットが小さくなると、スペースが節約され、ネットワーク経由で送信されるバイト数が減り、同時にストレージスペースが小さくなるため間接的にシステム パフォーマンスが向上するからです。

サーバー文字セット設定

[mysqld]
...
character-set-server=utf8 #サーバー側の文字セットを設定するには、このステートメントを追加します。

MySQL サーバーを再起動すると、これら 2 つのパラメータは設定値に変更されます。

| 文字セットサーバー | utf8 
| 文字セットデータベース | utf8

文字セットを切り替える

あるエンコーディングのデータベースを別のエンコーディングのデータに変換します。

alter database dbname character set xxx; #これは将来のデータに対してのみ有効であり、以前のデータに対しては無効です。基本的に使用されない

よく使用される変換データベース文字セットソリューション

mysqldump -S /tmp/mysql.sock4 --default-character-set=utf8 -d test > /data/test-`date +%F`.sql #1. データをエクスポートせずにテーブル構造をエクスポートする vim /data/test-`date +%F`.sql
`table10` が存在する場合はテーブルを削除します。
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
テーブル `table10` を作成します (
 `id` int(11) デフォルト NULL,
 `names` char(20) デフォルト NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; #2. ここで CHARSET を変更したい文字セットに変更しますmysqldump -S /tmp/mysql.sock4 --extended-insert --no-create-info test > /data/test-data-`date +%F`.sql #3. データ内容をエクスポートしますvim /data/test-data-`date +%F`.sql
テーブル `table10` をロックして書き込みます。
set names utf8; #4、この行が追加され、変換する文字セットを指定します INSERT INTO `table10` VALUES (1,'云中鹤');
テーブルのロックを解除します。

mysql> create database if not exists test; #5. 変換されたデータを保存するデータベースを作成します。クエリは正常、1 行が影響を受け、0 警告 (0.00 秒)

mysql -S /tmp/mysql.sock4 test < /data/test-`date +%F`.sql #6. テーブル構造をインポートするmysql -S /tmp/mysql.sock4 test < /data/test-data-2015-09-25.sql #7. テーブルデータをインポートする

やっと

これは私が 2015 年に MySQL を学習していたときに取ったメモです。今日はそれを皆さんと共有します。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • PHP で文字化けした中国語の文字を MySQL に書き込むためのサンプル ソリューション
  • Linux での MySQL の文字化け問題の解決方法
  • MySQL にテーブルデータを挿入するときに中国語の文字化けが発生する問題を解決する方法
  • JDBC 接続 mysql の文字化けしたコード例外問題の処理の概要
  • JDBC が MySQL に接続して中国語を処理するときに文字化けする問題の解決方法の詳細説明
  • MySQL データベースにおける中国語文字化け問題の詳細な説明
  • MySQLデータベース移行におけるデータ文字化けの問題を解決する

<<:  Vueはチャットインターフェースを実装する

>>:  ファイアウォールルールの設定とコマンド(ホワイトリスト設定)の詳しい説明

推薦する

CentOS 8 カスタム ディレクトリ インストール nginx (チュートリアルの詳細)

1. ツールとライブラリをインストールする# PCRE は、Perl 互換の正規表現ライブラリを含...

HTML でマウスが停止したときに行全体の色 (tr) を変更する方法

純粋な CSS を使用して、マウスが行の上を通過するときに行の背景色を変更し、その行にフォーカスがあ...

Vue で棒グラフを使用し、自分で設定を変更する方法

1. HTMLファイルでechartをインポートする <!-- echarts をインポート ...

VMware 仮想マシン (CentOS7 イメージ) を使用して Linux をインストールする

1. VMwareのダウンロードとインストールリンク: https://www.jb51.net/s...

Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体

1. Expressライブラリとジェネレータをインストールするcmdを開いて、次のコマンドを入力しま...

セマンティックタグを使用して、IE6、7、8と互換性のあるHTMLを記述します。

HTML5 では、ヘッダー、フッター、ナビゲーションなどのセマンティック タグが追加されているため...

特定の部門 ID に基づいて、すべての下位レベルの複数レベルのサブ部門を照会する MySQL の例

シミュレーションテーブルとデータスクリプト次の SQL ステートメントをコピーして、sys_dept...

CSS で点線の境界線のスクロール効果を実装するサンプルコード

マウスをある領域の上に置くと、その領域に点線の境界線と線のアニメーションが表示されるというクールな効...

Vue3 のレンダリング関数における互換性のない変更の詳細な説明

目次レンダリングAPIの変更レンダリング関数のパラメータレンダリング関数のシグネチャの変更VNode...

Centos7 で MySQL マスター スレーブ サーバーを構築する方法 (グラフィック チュートリアル)

この記事では主に CentOS 上で MySQL マスタースレーブサーバーを構築する方法を紹介します...

Reactはページング効果を実装する

この記事では、Reactでページング効果を実現するための具体的なコードを参考までに紹介します。具体的...

Ubuntu 18.04 システムでの Redis および phpredis 拡張機能のインストールと設定の詳細な説明

この記事では、Ubuntu 18.04 に Redis と phpredis 拡張機能をインストール...

Nginxホットデプロイメントの実装

目次セマフォNginx ホットデプロイメント上記のブログ投稿に従ってください。ファイアウォールをオフ...

Vue で ToDo アプリケーションを実装する例

背景まず最初に、私はフロントエンド開発の専門家ではないことを述べておきたいと思います。私の以前のコン...