R, Python, DB 備忘録

データベースとか、jupyter(Python)、Rとか色々

MonetDBクライアントで読み込む外部スクリプトはBOM付にしておく

MonetDBに絡むファイル(データCSVやその他諸々)はUTF-8にしておけば問題ないと思っていた。
(実際、ここを始めとしてMonetDB.orgの色々なところに書いてある。)

しかし、罠があった。
それは、BOM無しのUTF-8スクリプトファイル(.sql)の2バイト文字をうまく認識してくれないのだ。

具体的には

テーブル上の性別(sex_jp)「男」「女」を性別コード(sex)「0」「1」にそれぞれ変換したいとする。

ALTER TABLE tbl ADD COLUMN sex;
UPDATE tbl
  SET sex = CASE WHEN sex_jp = '' THEN 0 WHEN sex_jp = '' THEN 1 END;

このとき、上記のsqlを外部スクリプトとして読込む(\< henkan.sql)場合、追加したカラムsexは全て null になってしまう。
ちなみに、

UPDATE tbl
  SET sex = CASE WHEN sex_jp = '' THEN 0 WHEN sex_jp = '' THEN 1 ELSE 99 END;

と書けば、ELSE節が適用されて全て 99 になる。

解決法

冒頭に記載した通り、外部スクリプトBOM付UTF-8で保存したうえでクライアントから実行する。

おまけ

vimでBOM付UTF-8エンコーディングを変更するコマンド

:set fenc=utf-8 bomb