こんにちは、ミナピピン(@python_mllover)です。
特定のサイトの情報をスクレイピングして投稿するプログラムを作成したのですが、時々、投稿がDBに登録されず、ずっと悩んでいたのですが、ようやく原因が見つかりました。
結論から行くと、WordpressのデータベースにであるMysqlの文字コードに起因するエラーでした。というのもワードプレスのMysqlの文字コードは現在エックスサーバーから簡単インストールすると「utf8mb4」なのですが、古いバージョンではUTF-8みたいです。
どちらも一応UTF-8ではあるのですが、MysqlのUTF-8だと日本語・漢字コードが3バイトの範囲に限られているみたいです。これの何の不味いのかというと4バイトの日本語に対応していないので4バイトの日本語情報を入れようとするとdb insert errorが発生するみたいです。(一応4バイトの日本語の例として挙げると竈門禰津子の「禰」などがこれにあたります。)
そのためにMySQLで4バイトの文字情報を扱うために「utf8mb4」というのが後追いで作られたみたいで、2021年の今からワードプレスをインストールする場合はこれが標準なので基本インサートエラーは起きないのですが、古い文字コードがUTF-8 のMysqlだとこのエラーが起きるみたいです。
対策
Mysqlの文字コードをPHP経由で変更する
ワードプレスのテーマのfunction.phpからMysqlの文字コード設定を書き換えるというのが、調べた感じ無難みたいです。
やり方については↓参照
参考:https://cravelweb.com/webdesign/wp-customize/post-3987#WordPress
Pythonでテキストデータからややこしそうな文字列を抜く
utf-8で文字化けする文字はエスケープが付いているのでrawを使ってr'C://user/path/to/~~'
みたいな感じでエスケープを強引に無効化するというのも荒業ですが手の1つです。これを文字列を格納した変数に対して使用する場合はrepr()
を使います。
html_text = '<html><p>竈門禰津子</p></html>' repr(html_text)
コメント