8

以下を見てください。

/home/kinka/workspace/py/tutorial/tutorial/pipelines.py:33: Warning: Incorrect string 
value: '\xF0\x9F\x91\x8A\xF0\x9F...' for column 't_content' at row 1
n = self.cursor.execute(self.sql, (item['topic'], item['url'], item['content']))

文字列'\xF0\x9F\x91\x8Aは、実際には 4 バイトの Unicode:u'\U0001f62a'です。mysql の文字セットは utf-8 ですが、4 バイトの Unicode を挿入すると、挿入された文字列が切り捨てられます。私はそのような問題をグーグルで検索し、5.5.3 未満の mysql は 4 バイトの Unicode をサポートしていないことを発見しました。残念ながら、私のものは 5.5.224 です。mysql サーバーをアップグレードしたくないので、python で 4 バイトの unicode をフィルタリングしたいだけで、正規表現を使用しようとしましたが失敗しました。それで、何か助けはありますか?

4

3 に答える 3

10

MySQL が 4 バイト以上の UTF-8 コードを処理できない場合は、 codepoint ですべての Unicode 文字を除外する必要があり\U00010000ます。UTF-8 は、そのしきい値を下回るコードポイントを 3 バイト以下でエンコードします。

そのために正規表現を使用できます。

>>> import re
>>> highpoints = re.compile(u'[\U00010000-\U0010ffff]')
>>> example = u'Some example text with a sleepy face: \U0001f62a'
>>> highpoints.sub(u'', example)
u'Some example text with a sleepy face: '

または、値のみを含むマッピング テーブルで.translate()関数を使用することもできます。None

>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '

ただし、変換テーブルを作成すると大量のメモリが消費され、生成に時間がかかります。正規表現のアプローチの方が効率的であるため、おそらく努力する価値はありません。

これはすべて、UCS-4 でコンパイルされた Python を使用していることを前提としています。Python が UCS-2 サポート付きでコンパイルされている場合、正規表現では までのコードポイントしか使用できず'\U0000ffff'、そもそもこの問題に遭遇することはありません。

MySQL 5.5.3 の時点で、新しく追加されたutf8mb4コーデックは完全な Unicode 範囲をサポートしていることに注意してください。

于 2012-05-29T12:46:50.447 に答える
2

utf8の代わりにutf8mb4照合を使用して実行する必要があると思います

SET NAMES UTF8MB4

DB接続後(リンクリンクリンク

于 2014-07-02T07:15:46.687 に答える