1. kntmrkm

    Posted

    kntmrkm
Changes in title
+【PostgreSQL】バイナリ保存
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,61 @@
+
+がっつりハマりました。
+WEBの勉強初めて一番絶望的にわからなかった。
+
+WEBというかDBだったんですが。
+
+RailsアプリでPostgreSQLを使用し、DBに画像データをバイナリデータとして保存しています。しかし、環境によってDBに保存されるデータの形式が変わってしまいます。
+
+[QA@ITに質問した](http://qa.atmarkit.co.jp/q/3535)後に、キーワードをひねってたら解決策に辿り着いた。
+
+
+## 正しいデータ(意図するデータ)
+
+ `"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x05\xDC\x00\x00\x02X\b"`
+
+
+## 問題のデータ
+
+`"x89504e470d0a1a0a0000000d49484452000005dc0000025808..."`
+
+### 保存処理のコード
+
+コンソールから再現できたのでその際のコードです(irb)。
+
+``` irb
+file = ActionDispatch::Http::UploadedFile.new(tempfile: File.open(Rails.root.to_s + "/public/bg.png"))
+image = MiniMagick::Image.read(file)
+Master::Image.first.update_attribute(:data, image.to_blob)
+```
+
+上記を実行すると、`Master::Image.first.data`に入っているバイナリデータに差異が出ます。
+
+### 環境の差異
+
+#### 正しいデータとなる環境
+
+ローカルの環境と、AWS上のAmazonLinux(DBとしてRDSを使用)では上手く行きました。
+
+- ローカルのMacOSX、homebrewにてpostgreSQL, ImageMagickをインストール
+- AWSのRDS
+
+#### 問題のデータとなる環境
+
+- CentOS6.4
+ - `PostgreSQL 9.3.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit`
+
+VPS上のCentOSで現象を確認後、VMに構築したCentOSでも問題が再現しました。
+
+### 解決策
+
+- `alter role [username] set byte_output to ‘escape’;`
+
+としてやると無事画像データのまま保存されました。
+
+色々と調査するときは冷静に検索キーワードを変えてみることですね。
+
+今回は「postgres bytea activerecord」で引っかかりました。
+
+- [ActiveRecord loads binary field incorrectly on Heroku, fine on OSX](http://stackoverflow.com/questions/8539207/activerecord-loads-binary-field-incorrectly-on-heroku-fine-on-osx)
+
+英語を読めるのは必須ですね。WEB技術は。