MySQL сервер заменяет дополнительные символы Unicode с вопросительным знаком (?)

Я использую сервер Mysql 5.6.27 и Python в качестве приложения. База данных и таблицы установлены по умолчанию utf32_general_ci и тип столбца в utf8mb4, использование Anaconda Python 2.7 в Mac OS

В моей программе я открываю соединение mysql с charset='utf8mb4', Дополнительно я выполняю три нижеприведенных заявления после открытия соединения.

self._cursor.execute('SET NAMES utf8mb4')
self._cursor.execute("SET CHARACTER SET utf8mb4")
self._cursor.execute("SET character_set_connection=utf8mb4")

Моя проблема в том, что когда я вставляю строки в таблицу, она заменяет дополнительные символы Юникода на ?, Я искал ответы, и, похоже, нет никаких рекомендаций помимо того, что я уже реализовал (как подробно описано в этом вопросе).

Например, юникод U+2620 'SKULL AND CROSSBONES' был вставлен как правильный Юникод, но символ 'FALLEN LEAF' (U+1F342) был заменен ?,

Не уверен, что актуальный код Python, который приводит к вставке mysql, уместен, но я добавлю его на всякий случай.

Пожалуйста помоги.

Код Python для функции, которая вызывает вставку mysql

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 ответ

За 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.

Другие вопросы по тегам