mysql服务器用问号(?)替换补充的Unicode字符

时间:2016-07-01 19:58:47

标签: python-2.7 unicode mysql-5.6 utf8mb4 supplementary

我正在使用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

1 个答案:

答案 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