Я получаю эту ошибку, когда пытаюсь вставить определенные данные в таблицу:
'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)
Так что да, не знаю, что делать.
Кредит на запись строки 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")
По какой-то причине указание кодировки в соединении делает разницу.