【发布时间】:2013-06-22 14:24:24
【问题描述】:
我有一个数据库 (mysql),我想在其中存储腌制数据。
数据可以是例如字典,其中可能包含 unicode,例如
data = {1 : u'é'}
数据库(mysql)是utf-8格式。
当我腌制时,
import pickle
pickled_data = pickle.dumps(data)
print type(pickled_data) # returns <type 'str'>
得到的 pickled_data 是一个字符串。
当我尝试将其存储在数据库中(例如,在文本字段中)时,这可能会导致问题。特别是,我在某个时候得到了一个
UnicodeDecodeError "'utf8' codec can't decode byte 0xe9 in position X"
尝试将 pickled_data 保存在数据库中时。这是有道理的,因为 pickled_data 可以有非 utf-8 字符。我的问题是如何将 pickled_data 存储在 utf-8 数据库中?
我看到两个可能的候选人:
将 pickle.dump 的结果编码为 utf-8 并存储。当我想pickle.load时,我必须对其进行解码。
以二进制格式存储腌制字符串(如何?),这会强制所有字符都在 ascii 内。
我的问题是,从长远来看,我没有看到选择其中一个选项的后果。由于更改已经需要一些努力,因此我想就这个问题征求意见,寻求最终更好的候选人。
(P.S. 例如,这在Django 中很有用)
【问题讨论】:
-
选项 3:将 unicode 数据存储为 UTF-8 编码字符串。
-
选项 4:改用二进制列类型。
-
泡菜数据是二进制数据。您不能将其编码为 UTF-8(文本编码)。
-
@MartijnPieters,我编辑并改进了这个问题。感谢您的意见。
-
我并不是唯一一个被 Python 2 文档中有关 pickle 协议 0 的措辞所吸引的人。我看到他们改进了 Python 3 文档中的措辞,以明确所有协议都是二进制的。
标签: python django unicode utf-8 pickle