gpt4 book ai didi

mysql - Erlang Emysql 准备好的查询和常规查询之间的编码差异

转载 作者:行者123 更新时间:2023-11-29 08:57:01 24 4
gpt4 key购买 nike

我写了一个问题,得到了正确的答案 here关于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]).

我正在检索 Mojibake。 已编辑以使用正确的术语

我正在连接:

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

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

编辑:

我真的很想使用准备好的语句,这样可以有效防止 SQL 注入(inject)。

最佳答案

<小时/>

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

<小时/>

我相信这是 Emysql 中的一个错误,我想我已修复它。仍在制定单元测试,以便一切都有意义。当它发布到 github 时我会通知您。

我为此提出了一个问题:https://github.com/Eonblast/Emysql/issues/24

本质上,您是在欺骗驱动程序和数据库,因为您使用 latin-1 打开连接,但数据库是 utf-8。然后你就会被自动转换绊倒。

不过,我认为你是对的,驱动程序应该尊重你将连接设置为 latin-1,而不是自动转换为 utf-8。如果您阅读 github 上的 Eonblast/Emysql 的第 14 期问题,您会发现我一直怀疑自动转换是一个坏主意。

但是,仅从转换的单元测试现在增加了四倍这一事实来看(并提出了一些相当无趣但令人难以置信的边缘问题,我无法理解),我认为欺骗数据库你这样做的方式同样是一个坏主意。如果可以的话,你应该清理它,而不是依靠中间的机制来保持。 MySQL 中有多个级别发生转换。如您所知,您可以将连接、数据库以及表设置为字符集。这是产生错误的好方法。你能描述一下为什么你不能吗?因为你没有控制权并且必须对编码视而不见?我想知道是否存在没有这个 hack 就无法生存的真实案例。

无论如何,您对 latin-1 连接设置的提示可能表明了消除 Emysql 中字符转换中的全部或大部分猜测的方法。非常感谢,我希望今天晚些时候能为您提供解决方案。

亨宁

关于mysql - Erlang Emysql 准备好的查询和常规查询之间的编码差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9686979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com