ValueError: A string literal cannot contain NUL (0x00) characters.とは!くそハマったPostgresエラー

こんにちはマダラです!
久々に技術的っぽいことを書こうかなと思いました。

というのも、個人的にTwitterのクローラーから取って来た生データをPostgresデータベースに突っ込む作業をしていたのですが、めちゃくちゃハマったエラーがありました!

このエラーの解決策は日本語で紹介しているものがあまりなかったので書こう!となったわけです!笑

今回の私の解決策は結局根本的なものではないので、誰かコメントで教えてくれると嬉しいです。

スポンサーリンク

ValueError: A string literal cannot contain NUL (0x00) characters. とは

ValueError: A string literal cannot contain NUL (0x00) characters.

これは私が大ハマりしたエラーです。意味としては

「PostgreSQLデータベースにNULL文字を挿入するとき、文字列リテラルにNUL(0x00)文字のエラーメッセージを含めることはできません」

ということみたいですね!どうもpsycopg2のバージョン2.7以降からPostgresがNUL文字に対応しなくなった??という感じみたいです。
私のコードはPythonだったので、Pythonでのナル文字は "\ x00"ですね!

大量のツイートを順次DBに突っ込むなかで、一つのツイートのこのエラーによって書き込みが中断されてしまっていました。

なので最初は単純に、該当するツイートからreplace等で"\x00"を「""」に変換したりして除去すればいいじゃーんと思いました。

実際この方法で問題解決できる人も多いと思うので、ぜひ試してみて下さい!

管理人の場合、、、

私の場合も、先述の手法で解決しようと試みました。が、まったく変化は起きず、、、

ツイートを確認してみたところ一見普通のツイートでなぜこれが弾かれているのか全く不明でした。

普通にstr型だし、、

decodeしたりencodeしてみたり、、そもそも0x00なんてどこにも含まれていない、、、
なぜだ、、、

ちなみにこの謎エラーのツイートは1ヶ月にこの1ツイートのみ。
半端ない量のあるツイートからそのツイートだけがなぜがタイトル通りのエラーを起こしているわけです。

なんなんだこれは!!

対処法

原因はわかったのにうまく解決できない、、、
こうなったらもう、、、

解決しなくてよくね???笑

1ヶ月に1ツイートだけなんだからデータに全く影響ないし笑
というわけで、エラー解決はできなかったので、

except ValueError:
print(tweet['text'])
print(type(tweet['text'])) #str
continue

こんな感じで、とりあえずエラー起こしたツイートを確認しつつ、continueで飛ばしてしまおうというわけです。

以上、全く解決策になっていませんが、同じような境遇の方は御採用ください。

この1ツイートのために無駄な時間をかけていられない!!!

スポンサーリンク