我正在使用Mysql 5.6.27服务器和python作为应用程序。
数据库和表的默认值设置为utf32_general_ci
,列类型设置为utf8mb4
。在Mac OS上使用 Anaconda Python 2.7
在我的程序中,我打开了与charset='utf8mb4'
的mysql连接。另外,我在打开连接后执行以下三个语句。
self._cursor.execute('SET NAMES utf8mb4')
self._cursor.execute("SET CHARACTER SET utf8mb4")
self._cursor.execute("SET character_set_connection=utf8mb4")
我的问题是,当我向表中插入行时,它会用?
替换补充的unicode字符。我一直在寻找答案,除了我已经实施的内容之外似乎没有任何建议(详见本问题)。
作为例如unicode字符U+2620 'SKULL AND CROSSBONES'
作为正确的unicode插入,但字符'FALLEN LEAF' (U+1F342)
被?
替换。
不确定导致mysql插入的实际python代码是否相关,但我会把它放在以防万一。
请帮忙。
- 调用mysql insert的函数的Python代码 -
def insert_multiple_to_table(self, alliance_data_list):
list_tuple = []
for data in data_list:
dict_obj = dict.fromkeys(COLUMNS)
for name, value in data.iteritems():
if value == 'None':
value = 'null'
dict_obj[name] = value
data_tuple = tuple(dict_obj[item] for item in COLUMNS) #create an ordered list
list_tuple.append(data_tuple)
format_strings = " (" + ','.join(COLUMNS) + ") "
insert_query = "insert into " + self._tblname + format_strings + " VALUES (" + ','.join(['%s'] * len(COLUMNS)) + ")"
result = self._db.executemany(insert_query, list_tuple)
return result
答案 0 :(得分:0)
对于fallen leaf
,您需要utf8mb4,而不仅仅是utf8。
Python需要# -*- coding: utf-8 -*-
检查表中的列是否为CHARACTER SET utf8mb4
。查看SHOW CREATE TABLE
。
连接应该类似于
db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS,
db=DB_NAME, charset="utf8mb4", use_unicode=True)
(如果抱怨,请切换到utf8;我不清楚该条款是针对MySQL还是外部世界。)
另见Python notes。