2012-03-13 59 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]). 

我检索变为乱码。 编辑以使用方法,正确的说法

我与连接:

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

不幸的是,我不能使用,因为使用的数据库和存储的表情符号的这种方式,以前的软件的UTF8,如果我使用它将与新系统一起工作,但不适用于旧系统插入的行。

编辑:

我真的真的想用事先准备好的声明,这将有效地防止SQL注入。

+0

您是否有资格使用“乱码”,例如您是收到Mojibake还是错误? – 2012-03-14 21:42:40

+0

gibberish = Mojibake,是的......但只有用准备好的语句,现在,我正在使用非预处理语句,用mysql_util:encode()来确保没有可能的注入,但我真的想用准备好的声明。 – TheSquad 2012-03-14 23:21:19

回答

2

编辑:应修复在253b7f94f9b04526e6868d7b693e6e9ee41de374。感谢您的反馈。 https://github.com/Eonblast/Emysql/commit/253b7f94f9b04526e6868d7b693e6e9ee41de374


我相信这是Emysql错误,我想我固定它。仍然在完成单元测试,所以这一切都有道理。当它发布到github时,我会通知你。

我开的一个问题这个:https://github.com/Eonblast/Emysql/issues/24

从本质上讲,你是因为你打开与Latin-1的连接,但数据库是UTF-8诱骗驱动程序和数据库。然后你跳过自动转换。

不过,我认为你是正确的,司机应该尊重你设置连接到拉丁-1,而不是做自动转换为utf-8的魔力。如果你在github的Eonblast/Emysql上读到#14的问题,你会发现我总是怀疑自动转换是个坏主意。

但是,仅仅从单元测试转换的事实现在爆炸四倍(并提出一些相当无趣,但令人难以置信的边缘问题我不能让我的头),我认为欺骗数据库的方式也是一个坏主意。如果可以的话,你应该清理它,而不是依靠中间的机制来维持。 MySQL中有多个级别可以进行转换。如您所知,您可以将连接,数据库和表格设置为字符集。这是产生错误的好方法。你能描述为什么你不能?因为你无法控制,必须盲目地进行编码?我想知道是否有真正的情况下,你不能没有这种黑客生活。

无论如何,你对连接到latin-1的设置的抱怨可能表明了在Emysql中消除所有或大部分字符转换猜测的方法。非常感谢,我希望今天晚些时候我会有一个解决方案。

Henning

+0

感谢Henning,我也发现了这个“bug特性”,我会继续关注github。关于我为utf8使用latin-1连接的事实,我知道这是一个坏主意。不幸的是,我没有选择,我拿起了这个项目,并用Erlang从头开始重做它,但我现在无法更改数据库。但是我会通过将“prod”迁移到更加可聚集的东西,比如Cassandra,或者甚至Mnesia,来慢慢清理它。感谢您确认问题! +1 – TheSquad 2012-03-22 16:42:49

0

只是表转换你为UTF-8:

ALTER TABLE Users CONVERT TO CHARACTER SET utf8;

然后你可以使用UTF-8与新的数据和旧的将被转换为UTF-8以及。

+0

用户表已经在utf8字符集中,但这不是真正的问题在这里...我的问题是关于为什么准备好的语句使用utf8,因为我明确要求emysql连接到数据库与latin1字符集。 – TheSquad 2012-03-19 12:50:25

+0

那么如果我正确理解erlang,字符串是ISO8859-1(拉丁)编码,而二进制文件是UTF-8。 所以:“嗨”是拉丁文,但是<<"Hi">>是utf-8。 如果您指示emysql使用utf-8进行连接,会发生什么情况? – barsju 2012-03-19 13:43:36

+0

如果我使用UTF8连接数据库,我可以使用新软件正确添加/检索,唯一的问题是我无法正确检索数据库中已有的数据(我得到Mojibake数据),这些数据已与先前的软件一起插入。不幸的是我需要正确检索旧的数据。 – TheSquad 2012-03-19 17:02:48