我正在尝试使用Erlang在MySQL数据库上的iPhone客户端应用程序中存储文本(使用表情符号)。 (进入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 ++上
任何帮助都将不胜感激。
AS请求,这里是存储数据的查询:
UPDATE Table SET c=? WHERE id=?
非常简单......
答案 0 :(得分:1)
这是关于utf-8编码的全部内容。在Erlang中,在您的情况[240,159,152,130]
中,字符列表通常不会被编码,但是是unicode代码点。当您检索数据时,您得到的二进制文件包含字符的utf-8编码字节。正是这种编码发生的地方我不知道。来自erlang shell:
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列表和二进制文件之间进行转换的函数。