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 に設定されていました。
したがって、データベースの文字セットが正しく設定されていなくても、データベースから取得したデータが正しく表示されるのであれば、データベースのエンコーディングを正しく設定する必要があるのでしょうか。
特に知りたいのは:
- データベースのどの部分が列エンコーディング設定に依存していますか? この設定が本当の意味を持つのはいつですか?
- 列エンコーディングの暗黙的な変換が行われるのはどのような場合ですか?
- 列をバイナリ形式に変換してから目的のエンコーディングに変換するトリックはどのように機能しますか (上記の SQL コード スニペットを参照)。まだわかりません。
誰かが私が物事を片付けるのを手伝ってくれることを願っています...