Vermeiden Sie UnicodeEncodeError, wenn Sie Abfragen mit Japanisch in MySQLdb von Python auslösen

Überblick

Es gibt Zeiten, in denen Sie eine Einfügeanweisung von Python nach MySQL werfen möchten. Wenn ich das MySQLdb-Paket zum Senden einer Abfrage verwende, erhalte ich einen UnicodeEncodeError, wenn die Abfrage Japanisch enthält. Es scheint, dass dies vermieden werden kann, indem dem Argument von MySQLdb.connect () die Optionen "use_unicode = True" und "charset =" utf8 "" hinzugefügt werden.

Status

Angenommen, Sie haben eine solche MySQL-Datenbank.

mysql> desc test;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| test_id   | int(11)     | NO   | PRI | NULL    |       |
| test_text | varchar(64) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

Von Python wollte ich der Spalte test_text eine Zeichenfolge hinzufügen. Versuchen Sie, eine insert-Anweisung normalerweise mit dem MySQLdb-Paket zu werfen.

mysqltest.py


import MySQLdb
 
try: 
    conn = MySQLdb.connect(
    host=host,
    db=dbname,
    port=port,
    user=user,
    passwd=password
    )

    cur = conn.cursor()

    query = "insert into test values('1','aaa')"

    cur.execute(query)
    
except:
    cur.close()
    conn.close()

cur.close()
conn.commit()
conn.close()

Sie können dies normalerweise mit einer alphabetischen Zeichenfolge tun.

mysql> select * from test;
+---------+-----------+
| test_id | test_text |
+---------+-----------+
|       1 | aaa       |
+---------+-----------+

Wenn es sich jedoch um eine japanische Zeichenfolge handelt ...

mysqltest.py


(Kürzung)
    query = "insert into test values('2','ah ah')"

    cur.execute(query)
(Kürzung)
Traceback (most recent call last):
  File "mysqltest.py", line 30, in <module>
    conn.commit()
_mysql_exceptions.OperationalError: (2006, '')

Ich bekomme einen Fehler wie Dies scheint ein Fehler zu sein, wenn versucht wird, conn.commit () zu verwenden, nachdem eine Ausnahme in der try-Anweisung abgefangen wurde. Ich bin mir bei dieser Stapelverfolgung nicht sicher. Lassen Sie uns daher eine Stapelverfolgung ausgeben, wenn die Ausnahme-Anweisung ausgeführt wird.

mysqltest.py


import MySQLdb
import traceback

try: 
    conn = MySQLdb.connect(
    host=host,
    db=dbname,
    port=port,
    user=user,
    passwd=password
    )

    cur = conn.cursor()

    query = "insert into test values('2','ah ah')"

    cur.execute(query)

except:
    cur.close()
    conn.close()
    print(traceback.format_exc()) 

cur.close()
conn.commit()
conn.close()

Dann wird es so herauskommen.

Traceback (most recent call last):
  File "mysqltest.py", line 25, in <module>
    cur.execute(query)
  File "C:\path\to\anaconda\lib\site-packages\MySQLdb\cursors.py", line 248, in execute
    query = query.encode(db.encoding, 'surrogateescape')
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 29-31: ordinal not in range(256)

Ich werde wütend, dass die Abfrage nicht mit dem Zeichencode latin-1 codiert werden kann. Anscheinend codiert das MySQLdb-Paket standardmäßig mit Latin-1. Warum?

Gegenmaßnahmen

Wenn Sie auf [hier] verweisen (https://stackoverflow.com/questions/3942888/unicodeencodeerror-latin-1-codec-cant-encode-character), können Sie die Codierungsmethode anscheinend mit dem Argument MySQLdb.connect () angeben. .. Wenn Sie "use_unicode = True" und "charset =" utf8 "" als Argumente angeben,

mysqltest.py


import MySQLdb
import traceback

try: 
    conn = MySQLdb.connect(
    host=host,
    db=dbname,
    port=port,
    user=user,
    passwd=password,
    use_unicode=True,
    charset="utf8"
    )

    cur = conn.cursor()

    query = "insert into test values('2','ah ah')"

    cur.execute(query)

except:
    cur.close()
    conn.close()
    print(traceback.format_exc()) 

cur.close()
conn.commit()
conn.close()

Die Abfrage wurde erfolgreich in utf-8 codiert und hat funktioniert.

mysql> select * from test;
+---------+-----------+
| test_id | test_text |
+---------+-----------+
|       1 | aaa       |
|       2 |ah ah|
+---------+-----------+

Recommended Posts

Vermeiden Sie UnicodeEncodeError, wenn Sie Abfragen mit Japanisch in MySQLdb von Python auslösen
Behandelt japanische UTF-8-Zeichen in MySQL db of Python.
Japanische Ausgabe beim Umgang mit Python im Visual Studio
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
Achten Sie beim Drucken von Japanisch mit Python 3 auf LANG für UnicodeEncodeError
Verhalten bei der Rückkehr in den with-Block
Fügen Sie mit Colaboratory japanische Schriftarten in Bilder ein
Dekorateur zur Vermeidung von UnicodeEncodeError in Python 3 print ()