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.
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?
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