使用utf8mb4编码

fdbelqdn  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(333)
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表中的表中插入select数据并将它们写入一个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')

因此,如果with中有\n \u200b而不是\n,则会引发一个问题。我到处找,但找不到解决办法。我认为错误是因为ascii特殊字符。但我不知道怎么解决这个问题。

zfycwa2u

zfycwa2u1#

访问https://mathiasbynens.be/notes/mysql-utf8mb4 这是因为mysql的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;

执行这些查询,解决了问题。

相关问题