2

我正在尝试使用 Erlang 将来自 iPhone 客户端应用程序的文本(带有表情符号)存储在 MySQL 数据库中。(进入 varchar 列)

我曾经用 C++ 和 mysqlpp 完成的套接字连接服务器来做这件事,它工作得很好。(这是完全相同的数据库,所以我可以假设问题不是来自数据库

但是,出于可扩展性的原因,我决定在 Erlang 上传递所有内容,因为我无法正确存储和检索表情符号。

我正在使用 emysql 与我的数据库进行通信。

当我存储时,我将此列表发送到数据库:

[240,159,152,130]

当我检索时,我得到的是:

<<195,176,194,159,194,152,194,130>>

显然有一些相似之处,我们可以在两条线上看到 159、152 和 130,但没有看到 240。我不知道 195、176 和 194 是从哪里来的。

我想在创建连接池时更改 emysql 编码。

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

但我似乎可以找到适合 utf32 编码的原子。(有趣的是我没有在 C++ 和 mysqlpp 上设置任何编码,它开箱即用)。

我做了一些测试...

storing from C++, retrieving from C++ (Works fine)
storing from Erlang, retrieving from Erlang (Does not work)
storing from Erlang, retrieving from C++ (Does not work)
storing from C++, retrieving from Erlang (Does not work)

还有一个信息,我在 Erlang 上使用准备好的语句,而我不在 C++ 上

任何帮助,将不胜感激。

根据要求,这里是存储数据的查询:

UPDATE Table SET c=? WHERE id=?

真的很简单...

4

1 回答 1

1

这都是关于 utf-8 编码的。在 Erlang 中,在您的情况下[240,159,152,130],字符列表通常不是编码的,而是 unicode 代码点。当您检索数据时,您会得到一个二进制文件,其中包含字符的 utf-8 编码字节。我不知道这种编码发生在哪里。从二郎壳:

10> Bin = <<195,176,194,159,194,152,194,130>>.   
<<195,176,194,159,194,152,194,130>>
11> <<M/utf8,N/utf8,O/utf8,P/utf8,R/binary>> = Bin.
<<195,176,194,159,194,152,194,130>>
12> [M,N,O,P].
[240,159,152,130]

在 erlang 中处理 unicode 非常简单,列表中的字符通常是 unicode 代码点并且很少被编码,而将它们存储在二进制文件中意味着您必须以某种方式对它们进行编码,因为二进制文件只是字节数组。默认编码为 utf-8。在模块unicode中有用于在 unicode 列表和二进制文件之间进行转换的函数。

于 2012-03-12T23:10:01.597 回答