Mysql 1366 error-utf8mb4 используется кодировка

0
def connect():
    conn = mysql.connector.connect(host='localhost', database='otrs',     user='root', password='password', autocommit=True)
    if conn.is_connected():
        print('connected')
    sqlstr = "SELECT ticket.id, article.id, ticket_history.create_time, article.a_body FROM ticket, ticket_history, article WHERE ticket_history.ticket_id=ticket.id AND ticket_history.article_id=article.id AND (ticket.ticket_state_id=2 OR ticket.ticket_state_id=3) AND ticket_history.name ='%%Close' ;"

    cursor.execute(sqlstr)
    for row in cursor.fetchall():
        print row
        val= row[3].replace('\'','')
        print val
        sqlstr1 = "INSERT INTO temp VALUES (%s, %s, '%s','%s')" %(row[0], row[1], row[2], val)
        cursor.execute(sqlstr1)
        print 'done'

Я написал запрос на python, чтобы вставлять данные из таблиц в таблицу mysql и записывать их в таблицу temp. Когда я выполняю запрос, после ввода нескольких строк данных возникают такие исключения, как

DatabaseError: 1366 (HY000): Incorrect string value: '\xE2\x80\x8BWil...'
DatabaseError: 1366 (HY000): Incorrect string value: '\xE2\x80\x8BVid...'
DatabaseError: 1366 (HY000): Incorrect string value: '\xE2\x80\x8BSol...'

Записи, которые вызывают проблемы,

(2932, 10503, datetime.datetime(2016, 10, 19, 17, 2, 7), u'Hi Arshadh,\n\nThis has been configured on PR FWSM device only\n\nBR,\n\u200bViduna\n\xa0')
(3136, 13353, datetime.datetime(2016, 11, 25, 12, 40, 35), u'This has been postponed as we need support from forinet TAC team to resolve\nthis.\nWaiting for their feedback.\n\u200bWill raise new ticket when we get update from them\n')
(3661, 18395, datetime.datetime(2017, 1, 27, 15, 34, 45), u'This request has been performed on 1/26/2017,\n\u200bSince the testing is getting delayed- closing the cr\xa0\nwe can reopen this again if there is any problem.\n')

Но приведенный ниже набор данных не вызывает ошибки,

(3672, 18393, datetime.datetime(2017, 1, 27, 15, 28, 9), u'This request has been performed on 1/26/2017,\nSince the testing is getting delayed- closing the cr\xa0\nwe can reopen this again if there is any problem.\n')

Поэтому возникает проблема, если с \n\n200b\n\u200b. Я искал везде, но не мог найти решение. Я думаю, что ошибка вызвана специальными символами ASCII. Но я не знаю, как решить проблему.

  • 0
    Почему вы получаете данные на стороне клиента? Используйте синтаксис insert ... select ... в MySQL для передачи данных непосредственно между таблицами.
  • 0
    Я хотел найти ошибку, которая не позволила мне выполнить этот запрос
Показать ещё 5 комментариев
Теги:
mysql-python

1 ответ

0
Лучший ответ

Посетите https://mathiasbynens.be/notes/mysql-utf8mb4 Это потому, что в MySQLs utf8 кодировка только частично реализует правильную кодировку UTF-8. Поэтому преобразование базы данных в utf8mb4 решило проблему.

Для каждой базы данных:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Для каждой таблицы:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Выполняя эти запросы, решила проблему.

Ещё вопросы

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