2012-03-13 5 views
0

私はemysqlエンコーディングに関して正しい答えhereを持っている質問を書いています。別の質問を特定 答え...Erlang Emysqlは、準備されたものと通常のもののエンコーディングの違いを問合せしています。

私はiPhoneがデータベースに絵文字保存しようとしている...

私が行うと:

Query = io_lib:format("UPDATE Users SET c=\"~s\" WHERE id=~B", [C, Id]), 
emysql:execute(mydb, Query). 

すべてが正常に動作します...

しかしで:

emysql:prepare(update_c, <<"UPDATE Users SET c=? WHERE id=?">>), 
emysql:execute(mydb, update_c, [C, Id]). 

私は文字化けを取得しています。 CORRECT TERMに

を使用するようにEDITED 私はと接続しています:

emysql:add_pool(my_db, 3, "login", "password", "db.mydomain.com", 3306, "MyTable", latin1) 

私は使用を行う場合は残念ながら、私は、理由のデータベースと保存された絵文字の使用以前のソフトウェアのそのようにUTF8を使用することはできませんutf8の場合、新しいシステムでは動作しますが、古いシステムでは挿入されない行では動作しません。

EDIT:

私は本当にプリペアドステートメントを使用したい、効果的にSQLインジェクションを防止するであろう。

+0

「門番」を受け取ることができますか、たとえば間に合わせのエラーがありますか? –

+0

gibberish = Mojibake、はい...しかし準備されたステートメントでのみ、私は準備ができていないステートメントをmysql_util:encode()を使って使用していますが、注入はできませんが、ステートメント。 – TheSquad

答えて

2

編集:253b7f94f9b04526e6868d7b693e6e9ee41de374に固定されなければなりません。フィードバックありがとうございます。 https://github.com/Eonblast/Emysql/commit/253b7f94f9b04526e6868d7b693e6e9ee41de374


私はそれがEmysqlに誤りだと考えていると私はそれを修正だと思います。それでもすべてが理にかなっているようにユニットテストを進めています。私はそれがgithubに投稿されたときにお知らせします。私はこのために問題を開いた

:基本的にhttps://github.com/Eonblast/Emysql/issues/24

あなたはラテン-1との接続を開くが、データベースがUTF-8であるので、あなたは、ドライバとデータベースをだましています。それからあなたは自動変換の上を旅します。

でも、私は、ドライバがlatin-1への接続を設定し、utf-8への自動変換の魔法をしないことを尊重すべきだと思います。あなたがgithubでEonblast/Emysqlで第14号を読むと、私は常に自動変換が悪い考えであると思うでしょう。

しかし、変換の単体テストが現在4倍になっているという事実(ちょっと面白いですが、頭が浮かんでいないと思っていますが頭がおかしい)から、あなたがやっているやり方も同様に悪い考えです。可能であれば、その間にあるメカニックに頼るよりも、これをきれいにする必要があります。 MySQLには変換が行われる複数のレベルがあります。あなたが知っているように、接続、データベース、文字セットへのテーブルを設定することができます。これはバグを作る素晴らしい方法です。なぜできなかったのか説明できますか?あなたはコントロールを持たず、エンコーディングに盲目的に行動しなければならないからです。あなたがこのハックなしでは生きられない本当のケースがあるかどうかを知りたいのですが。

latin-1への接続設定に関する苦情は、おそらくEmysqlの文字変換の推測のすべてまたはほとんどを排除する方法を示していました。これは非常に感謝しており、私は今日あなたのために解決策があることを願っています。

ヘニング

+0

Thanks Henning、私はこの「バグフィーチャー」も見つけました。私はギターに目を留めます。私がutf8にlatin-1接続を使用しているという事実に関しては、これは悪い考えです。残念ながら私は選択肢がありません、私はプロジェクトをピックアップし、Erlangで最初からそれをやり直しますが、私は今データベースを変更することはできません。しかし、私はカサンドラ、または多分Mnesiaのように、より積極的なものに移行することによって、ゆっくりとそれをきれいにするでしょう。問題を確認していただきありがとうございます! +1 – TheSquad

0

だけでUTF-8にあなたのテーブルを変換する:

ALTER TABLE Users CONVERT TO CHARACTER SET utf8;

次にあなたが新しいデータでUTF-8を使用することができますし、古いが、UTF-8 aswellに変換されています。

+0

ユーザテーブルはすでにutf8文字セットになっていますが、実際には問題ではありません...私の質問は、明示的にeminSQLにlatin1文字セットでデータベースに接続するように依頼してからutf8を使用している理由です。 – TheSquad

+0

私が正しくerlangを理解していれば、文字列はISO8859-1(ラテン)でエンコードされ、バイナリはUTF-8です。 "Hi"はlatinですが、<<"Hi">>はutf-8です。 utf-8を使用してemysqlに接続するよう指示するとどうなりますか? – barsju

+0

データベースに接続するためにUTF8を使用すると、新しいソフトウェアで正しく追加/取得できますが、以前のソフトウェアで挿入されたデータベース(既にMojibakeデータを取得済み)のデータは正しく取得できません。残念ながら古いデータを正しく取得する必要があります。 – TheSquad

関連する問題