NULL文字を削除する

csvデータをpostgresqlにインポートしようとしたら、エラーが。

ERROR:  invalid byte sequence for encoding "SJIS": 0x00

NULL文字が含まれているのが、納得いかないようす。NULL文字は目で見えない制御文字なので、どうやって削除したもんかなーと思ったら、trコマンドで簡単に除去できました。

$ cat src.csv | tr -d "\000" > dest.csv

これでインポートはバッチリでした。

今回のケースは、SQLServer のデータを postgresql に移行する作業中に起こったもの。この両者でデータ移行する際は、色々と面倒なことが多い。

SQLServer が吐き出してくれる csv の文字コードは Unicode (UCS-2) なので、この文字コードを変換しつつ、NULL文字も削除しつつ、postgresql に移行する場合は、次のような感じ。

$ iconv -f ucs-2 -t cp932 src.csv | tr -d "\000" > dest.csv
$ psql target-db
# \encoding SJIS
# COPY table FROM 'dest.csv' WITH CSV NULL AS 'NULL';

SQLServer では datetime 型のカラムが NULL の場合、NULLという文字を出力するんだけど、これを postgresql の timestamp 型に copy しようとすると、エラーになってしまう。COPY時に NULL AS 'NULL' を付けることで、NULL という文字列を NULL として扱わせることができるので、timestamp型を NULL でインサートできるようになります。

お疲れさまでした。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/492