MYSQL выдает ошибку кодека latin-1, хотя я использую utf8mb4

0

Я получаю эту ошибку, когда пытаюсь вставить определенные данные в таблицу:

'latin-1' codec can't encode character '\u2019' in position 8: ordinal not in range(256)

Проблема в том, что я не использую latin-1 в любом месте - таблица utf8mb4 и сортировка - utf8mb4_unicode_520_ci. Чтобы убедиться, что это так, я проверил:

mysql> SHOW FULL COLUMNS FROM CustomCommands_u1eae585f88c8ab055a227488b2b5adb1;
+-----------------+---------------+------------------------+------+-----+---------+-------+---------------------------------+---------+
| Field           | Type          | Collation              | Null | Key | Default | Extra | Privileges                      | Comment |
+-----------------+---------------+------------------------+------+-----+---------+-------+---------------------------------+---------+
| command_id      | int(10)       | NULL                   | YES  |     | NULL    |       | select,insert,update,references |         |
| text            | varchar(2000) | utf8mb4_unicode_520_ci | YES  |     | NULL    |       | select,insert,update,references |         |
| contentMetadata | varchar(1000) | utf8mb4_unicode_520_ci | YES  |     | NULL    |       | select,insert,update,references |         |
| contentType     | int(3)        | NULL                   | YES  |     | NULL    |       | select,insert,update,references |         |
+-----------------+---------------+------------------------+------+-----+---------+-------+---------------------------------+---------+

И, конечно же, это определенно utf8mb4. Это код python, который я использую для вставки данных в таблицу:

def _add_cc(self, rid, text, contentMetadata, contentType):
    query = "INSERT INTO 'CustomCommands_%s' ('command_id','text','contentMetadata','contentType') VALUES (%s,%s,%s,%s)" % (self._mid,'%s','%s','%s','%s')
    tup = (rid,text,str(contentMetadata),contentType)
    print(query)
    print(tup)
    self._cur.execute(query, tup)

Запрос, который он напечатал, был:

INSERT INTO 'CustomCommands_u1eae585f88c8ab055a227488b2b5adb1' ('command_id','text','contentMetadata','contentType') VALUES (%s,%s,%s,%s)

И кортеж был:

(1470115915, '@Lil Capn Jack ', '{\'MENTION\': \'{"MENTIONEES":[{"M":"u98de557a46645dc6cd7583e538e1ae40","S":"0","E":"15"}]}\'}', 0)

Так как все это utf8mb4, я не уверен, почему я получаю ошибку латинского-1 кодека. Я даже запустил код ниже, и он все равно дал мне ту же ошибку.

db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="database")
db.autocommit(True)
cur = db.cursor()

tables = []
cur.execute("SHOW TABLES")
for row in cur.fetchall():
    tables.append(row[0])

for table in tables:
    cur.execute("ALTER TABLE %s CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci" % table)

Так что да, не знаю, что делать.

  • 1
    Проблема в этом специальном символе «»? Может быть, этот вопрос поможет вам: stackoverflow.com/questions/6202726/…
  • 0
    @DanielE. О, дерьмо, это сработало. Ты так много :)
Теги:
python-3.x
mysql-error-1064
iso-8859-1
utf8mb4

1 ответ

0

Кредит на запись строки UTF-8 в MySQL с помощью Python и человека, выше которого он поделился (https://stackoverflow.com/users/5871602/daniel-e, idk, как пометить вас)

Когда я устанавливаю свое соединение, вместо этого:

db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="database")

Я должен был сделать это:

db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="database", charset="utf8mb4")

По какой-то причине указание кодировки в соединении делает разницу.

  • 0
    Эта кодировка объявляет, какую кодировку использует клиент .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню