11

サーバー 2003 で古い 5.1 Mysql サーバーを実行しています。最近、Mysql 5.6 とサーバー 2008 を使用する新しい環境に移行しました。新しいサーバーでは、「Ã」などの特殊文字を挿入するとエラーが発生し続けます。

ソースのエンコーディングを確認したところ、UTF-8 でした。しかし、古い Mysql サーバーは、照合 latin_swedish_ci を使用して latin1(サーバー / テーブル / コロン) として構成されており、古い環境ではエラーを受け取りませんでした。

新しい環境に住んでいないので、いくつかのテストを行いました。すべてのテーブルをテーブル/コロンとlatin1に設定しようとしました。どちらの場合も、これらのエラーが発生し続けます。

私が気づいたのは、古いサーバーではサーバーのデフォルトの文字セットがlatin1であり、新しいサーバーではutf-8であるということです. それが問題でしょうか?ソースが utf-8 であるため、これは非常に奇妙です。

古い環境でオンにできる、これを処理するためのオプションはありますか? そのようなものが存在するかどうかはわかりません。mysql 管理ツール内の設定を比較しましたが、デフォルトの文字セットは別として、同じように見えます。

編集:

「char%」のような変数を表示します。

古いサーバー:

+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | utf8                                          | *
| character_set_connection | utf8                                          | *
| character_set_database   | latin1                                        |
| character_set_filesystem | binary                                        |
| character_set_results    | utf8                                          | *
| character_set_server     | latin1                                        |
| character_set_system     | utf8                                          |

新しいサーバー:

+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | utf8mb4                                       | *
| character_set_connection | utf8mb4                                       | *
| character_set_database   | utf8                                          |
| character_set_filesystem | binary                                        |
| character_set_results    | utf8mb4                                       | *
| character_set_server     | utf8                                          |
| character_set_system     | utf8                                          |

MySQL サイトの記事からわかる限り、utf8mb4 は utf8 のスーパーセットです。エンコーディングに関しては基本的に同じなので、エンコーディングの問題は発生しないはずです。

4

4 に答える 4

2
  1. まず、古い環境は正しく機能していたので、最初の選択肢は、新しい環境で同じ「文字セット」設定を使用することです。まだ 5.0 サーバーにアクセスできる場合は、SHOW VARIABLES;.

5.0 のデフォルトはlatin1; 5.6 のデフォルトはutf8です。これは主に

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | utf8                                          | *
| character_set_connection | utf8                                          | *
| character_set_database   | latin1                                        |
| character_set_filesystem | binary                                        |
| character_set_results    | utf8                                          | *
| character_set_server     | latin1                                        |
| character_set_system     | utf8                                          |

SET NAMES utf8;3 つのフラグ付き行を設定します。

ÃC3latin1 とC383utf8 では16 進数です。その他のエンコーディングはこちら. これを実行して、現在テーブルにあるものを確認します。

SELECT col, HEX(col) FROM table WHERE ...
  1. 別の可能性は、「移動」によってデータが破損したことです。両方のマシンで同じことができ、結果SELECTが異なる場合、移行はうまくいきませんでした。データを移動するにはさまざまな方法があるため、移行の詳細をお知らせください。何が問題なのかを分析できます。

  2. あなたのタイトルには、C29F. APPLICATION PROGRAM COMMAND聞いたことのない制御コードです。(注:Ã後でおっしゃったこととは関係ありません。) 問題の例をもっと教えてください。これらの手がかりはどちらも役に立ちません。

于 2015-06-29T16:38:45.187 に答える
2

MySQLの古い UTF-8 は、実際の UTF-8 ではありませんでした。「特殊」文字 (日本語または中国語) を試すと、古いサーバーで四角形や疑問符が表示される可能性があります。

新しいサーバーは実際には UTF-8 を使用しています (mb4 はマルチバイト 4 を表します)。サーバーは UTF-8 文字を受け取りますが、テーブルが UTF-8 を使用していないため、明らかに UTF-8 文字を格納できません。すべてのテーブルを UTF-8 に、データベースを UTF-8 に変換すると、問題が解決します。

あなたはこれを行うことができます:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

事前にバックアップをお忘れなく。

ソース: https://stackoverflow.com/a/6115705/1980659

于 2015-07-03T15:02:18.770 に答える
0

アプリケーションを新しい環境に移動したときに得た経験の1つ。テーブルに挿入するデータに関連するデータを挿入するときに奇妙なことがありました.私の場合、日付が空だったのでテーブルに挿入できませんでした. 、tomcat 6 から tomcat 7、新しい Suse サーバー バージョン)。

アプリケーションの mysql コネクタ ドライバを新しいバージョンに置き換えようとしたところ、問題が解決しました。

于 2015-06-23T14:37:23.837 に答える