Django 1.4.2 / Python 2.7.3 /MySQL5.5.28サイトを実行しています。このサイトの機能の1つは、管理者がサーバーに電子メールを送信できることです。サーバーは、電子メールを解析してDBに投げ込むprocmailを介してPythonスクリプトを呼び出します。私はこのサイトの2つのバージョン(開発サイトと本番サイト)を管理しています。両方のサイトは異なるが同一のvitualenvsを使用しています(念のため、両方を削除し、すべてのパッケージを再インストールしました)。
奇妙な問題が発生しています。まったく同じスクリプトが開発サーバーで成功し、本番サーバーで失敗します。このエラーで失敗します:
...django/db/backends/mysql/base.py:114: Warning: Incorrect string value: '\x92t kno...' for column 'message' at row 1
私はDjangoが抱えるUnicodeの問題をよく知っており、このエラーについてSOにたくさんの質問があることを知っていますが、最初からデータベースをUTF-8としてセットアップするようにしました。
mysql> show variables like "character_set_database";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "collation_database";
+--------------------+-----------------+
| Variable_name | Value |
+--------------------+-----------------+
| collation_database | utf8_general_ci |
+--------------------+-----------------+
1 row in set (0.00 sec)
さらに、各列に独自の文字セットを含めることができることは知っていますが、message
実際にはその列はUTF-8です。
mysql> show full columns in listserv_post;
+------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| id | int(11) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | |
| thread_id | int(11) | NULL | NO | MUL | NULL | | select,insert,update,references | |
| timestamp | datetime | NULL | NO | | NULL | | select,insert,update,references | |
| from_name | varchar(100) | utf8_general_ci | NO | | NULL | | select,insert,update,references | |
| from_email | varchar(75) | utf8_general_ci | NO | | NULL | | select,insert,update,references | |
| message | longtext | utf8_general_ci | NO | | NULL | | select,insert,update,references | |
+------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
6 rows in set (0.00 sec)
なぜ私がこのエラーが発生するのか誰かが知っていますか?なぜそれは本番構成では発生しますが、開発構成では発生しませんか?
ありがとう!
[編集1]
明確にするために、データも同じです。サーバーに1通のメールを送信するとprocmailが送信します。.procmailrcは次のようになります。
VERBOSE=off
:0
{
:0c
| <path>/dev/ein/scripts/process_new_mail.py dev > outputdev
:0
| <path>/prd/ein/scripts/process_new_mail.py prd > outputprd
}
process_new_mail.pyのコピーは2つありますが、これは、2つの別々の環境を維持できるようにバージョン管理されているためです。2つの出力ファイル(受信したメッセージを含む)を比較すると、それらは同一です。
[編集2]devとprdの両方の構成が失敗していることを実際に発見しました。違いは、dev configがサイレントに失敗することです(おそらくDEBUG
設定に関係しているのでしょうか?)。問題は、メッセージの1つにいくつかのユニコード文字があり、Djangoが何らかの理由でそれらを窒息させていることです。私は進歩しています...
メッセージをASCIIおよびUTF-8として明示的にエンコードするようにコードを編集しようとしましたが、それでも機能しません。でも、近づいています。