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はチャットインターフェースを実装する

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

推薦する

haslaylout と bfc 解析の理解

1. haslayout と bfc は IE 固有の標準属性です。 2. BFC はページ上の分離...

Vue3を使用してjsで呼び出せるコンポーネントを実装する

目次序文1. 従来のVueコンポーネント1. メインコンポーネントコード: 2. 使用方法3. 成果...

CSSレイアウトにおけるフロート属性と位置属性の違い

CSS レイアウト - position プロパティposition 属性は、要素に適用する配置方法...

2018 年にリリースされる Apache Spark 2.4 の新機能は何ですか?

この記事は、2018 年 9 月 19 日に Adob​​e Systems Inc で開催された ...

CocosCreator でカメラトラッキングに cc.follow を使用する方法

Cocos Creator バージョン: 2.3.4デモのダウンロード: https://files...

MySQLインデックスを追加する3つの原則を簡単に理解する

1. インデックスの重要性インデックスは、列に特定の値を持つ行をすばやく見つけるために使用されます。...

コードを通じてHTMLエスケープ文字を識別する方法について説明します

データ内に次のような特徴を持つ「 ' 」などの文字が含まれることがあります。 &# ...

Linux での MongoDB のインストールと設定のチュートリアル

MongoDBインストールYumを使用してインストールすることを選択する1. repoファイルを作成...

jQueryは従業員情報の追加と削除の機能を実装します

この記事では、従業員情報の追加と削除の機能を実装するためのjQueryの具体的なコードを参考までに共...

CSS XTHML の記述標準とよくある問題の概要 (ページ最適化)

プロジェクトドキュメントディレクトリDiv+CSS 命名規則 - 4 - Div+css 命名規則 ...

Linux のよく使うコマンドの使い方を詳しく解説(第 2 回)———— テキストエディタのコマンド vi/vim

vi/vim の紹介どちらもマルチモード エディターです。違いは、vim が vi のアップグレー...

Linux 上の Vim で色とテーマを変更する方法

Vim は Linux でよく使用されるテキスト エディターです。 Vim は、Sublime や ...

JavaScriptはブラウザがIEかどうかを判定します

フロントエンド開発者としては、IEの落とし穴は避けて通れません。他のブラウザはいいのにIEは壊れてい...

ブラウザでTIF形式の画像を表示する方法

ブラウザはTIF形式の画像を表示しますコードをコピーコードは次のとおりです。 <html>...

MySQL 8.0 の新機能 - チェック制約の紹介

目次序文チェック制約作成、削除、表示制限要約する序文MySQL 8.0 では、チェック制約という非常...