2

UTF-8 でエンコードされたデータを含む .sql スクリプトから MySQL データベースにデータをインポートしています。

mysql ... database_name < script.sql

その後、このデータは Web アプリケーション (そのデータベースに接続) のページに、再び UTF-8 で表示されます。しかし、非ASCII文字が正しく表示されなかったため、プロセスのどこかで問題が発生しました。

それを解決するための最初の試みは、mysql 列のエンコーディングを UTF-8 に変更することでした (たとえば、ここで説明されているように)。

alter table wp_posts change post_content post_content LONGBLOB;`
alter table wp_posts change post_content post_content LONGTEXT CHARACTER SET utf8;

しかし、それは役に立ちませんでした。

最後に、追加のコマンド ライン フラグを使用して .sql スクリプトからデータをインポートすることで、この問題を解決しました。これにより、mysql クライアントは .sql スクリプトからのデータを UTF-8 として処理するよう強制されたと思われます。

mysql ... --default-character-set=utf8 database_name < script.sql

それは役に立ちましたが、今回は列のエンコーディングを utf8 に変更するのを忘れていたことに気付きましたlatin1。utf-8 でエンコードされたデータがデータベースを (SQL スクリプトからアプリケーションに) 流れていたとしても、これは utf8 に設定されていました。

したがって、データベースの文字セットが正しく設定されていなくても、データベースから取得したデータが正しく表示されるのであれば、データベースのエンコーディングを正しく設定する必要があるのでしょうか。

特に知りたいのは:

  1. データベースのどの部分が列エンコーディング設定に依存していますか? この設定が本当の意味を持つのはいつですか?
  2. 列エンコーディングの暗黙的な変換が行われるのはどのような場合ですか?
  3. 列をバイナリ形式に変換してから目的のエンコーディングに変換するトリックはどのように機能しますか (上記の SQL コード スニペットを参照)。まだわかりません。

誰かが私が物事を片付けるのを手伝ってくれることを願っています...

4

1 に答える 1

1

私の考えでは、最大の理由は、DBの整合性が損なわれることです。

  • データベース内のデータをチェックする必要があることがよくあります。また、WebページからMySQL CLIクライアントにUTF-8文字列を正しく入力できない場合は、残念です。
  • phpMyAdminを使用して「正しい」Webを介してデータベースを管理する必要がある場合は、自分自身を制限していることになります(ただし、問題にはならない可能性があります)。
  • データに関するレポートを作成する必要がある場合、Webのみが正しい出力を生成していることを考えると、可能な選択肢の数によって大幅に制限されます。
  • 分析のために部分的なデータベース抽出物をパートナーまたは外部企業に提供する必要があり、抽出物が台無しになっている場合、それは残念です。

今あなたの質問に:

  1. データベースにORDER BY文字列データ型の列を要求する場合、列ごとにエンコードが異なる場合に内部変換が適用されるため、並べ替えルールでは列のエンコードが考慮されます。文字列を比較しようとしている場合も同じことが当てはまります。ここでは、エンコーディング情報が不可欠です。ほとんどの人はこの機能をそれほど頻繁に使用しませんが、エンコーディングは照合と一緒に行われます。

  2. 前述のように、異なるエンコーディングの列のセットがある場合、データベースは値を共通のエンコーディング(現在はUTF8)に暗黙的に変換することを選択します。文字列の暗黙的なエンコーディングは、クライアントの環境エンコーディングに応じて、クライアントフレームワーク/ライブラリで実行される場合があります。通常、データはサーバーに送信されるときにデータベースのエンコーディングに再コード化され、結果が配信されるときにクライアントのエンコーディングに戻されます。

  3. バイナリデータにはエンコーディングの概念はなく、単なるバイトのセットです。したがって、バイナリに変換すると、データを変更せずに保持しますが、データベースにエンコーディングを「忘れる」ように指示します。後で、正しいエンコーディングを適用する文字列に変換します。このトリックは、データが物理的にUTF-8にあることが確実で、誤って別のエンコーディングが指定された場合に役立ちます。

を使用してデータベースにデータをロードすることができたので、環境に関係があることを考えると、--default-character-set=utf8UTF8セットアップではなかったと思います。

今日のベストプラクティスは次のとおりだと思います。

  • シェルを含め、すべての環境でUTF8に対応している。
  • すべてのデータベースをデフォルトでUTF8エンコーディングにします

これにより、エラーのフィールドが少なくなります。

于 2012-04-24T12:00:49.257 に答える