Wie Sie richtig legen Sie utf-8-Zeichen in eine MySQL-Tabelle mithilfe von python
Ich bin sehr verwirrt und verwundert, wie Speichere ich strings mit Sonderzeichen (für jemanden, der verwendet wird, um den Umgang mit UK-englischen Zeichensatz) in Ihnen.
Hier ist mein Beispiel.
Habe ich diese Namen: Bientôt l'été
Dies ist, wie ich meine Tabelle:
CREATE TABLE MyTable(
'my_id' INT(10) unsigned NOT NULL,
'my_name' TEXT CHARACTER SET utf8 NOT NULL,
PRIMARY KEY(`my_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Mit diesem vereinfachten python-script, das ich versuche, legen Sie die Zeichenfolge in einer MySQL-Datenbank und-Tabelle:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb
mystring = "Bientôt l'été"
myinsert = [ { "name" : mystring.encode("utf-8").strip()[:65535], "id" : 1 } ]
con = None
con = MySQLdb.connect('localhost', 'abc', 'def', 'ghi');
cur = con.cursor()
sql = "INSERT INTO 'MyTable' ( 'my_id', 'my_name' ) VALUES ( %(id)s, %(name)s ) ; "
cur.executemany( sql, myinsert )
con.commit()
if con: con.close()
Wenn ich dann versuche, den Namen zu Lesen, die in der Datenbank gespeichert als: Bientôt l'été
Will ich es Lesen: Bientôt l'été
Wie bekomme ich das python-script/MySQL-Datenbank zu tun? Ich denke, dass dies etwas zu tun mit dem Zeichensatz, und wie es gesetzt ist, aber ich kann nicht finden, eine einfache web-Seite, die erklärt, ohne Fachchinesisch. Ich habe gekämpft, mit diesem für Stunden!
Habe ich angeschaut, und ich sehe character_set_server
wird als latin1
aber ich weiß nicht, ob das das problem ist oder wie es zu ändern:
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
- soweit ich weiß
u"string"
ist, wie Sie geben Sie eine Zeichenkette im utf8-format - Ist dies Python 2, Sie brauchen nicht zu rufen
encode()
. Nur verwenden, wennmystring
ist einunicode
Objekt. Da Sie die source-code-Codierung auf UTF8, Ihremystring
ist bereits codiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, diese Abfrage
set names utf8;
con.set_character_set('utf8') cur.execute('SET NAMES utf8;') cur.execute('SET CHARACTER SET utf8;') cur.execute('SET character_set_connection=utf8;')
Legen Sie die Standard-client-Zeichensatz:
Dein problem, wie du display die Daten beim Lesen aus der Datenbank. Sie sind auf der Suche UTF-8-Daten falsch interpretiert, wie Latin-1.
Den oben kodierte
unicode
string auf UTF-8, dann missversteht es als Latin-1 (ISO 8859-1), und dieô
undé
codepoints, die codiert wurden, um zwei UTF-8-bytes werden re-interpretiert als zwei latin-1-code Punkte.Da Sie ausführen, Python 2, sollten Sie nicht brauchen, um
.encode()
bereits kodierte Daten. Es wäre besser, wenn Sie eingefügtunicode
Objekte statt; so dass Sie wollen, um decodieren statt:Durch den Aufruf
.encode()
auf die codierten Daten, die Sie fordern Python zum ersten decodieren die Daten (unter Verwendung der Standard-Codierung), so dass es dann codieren kann für Sie. Wenn der Verzug auf Ihre python wurde geändert, umlatin1
Sie sehen würde, den gleichen Effekt; UTF-8-Daten interpretiert als Latin-1, bevor Sie re-codiert Latin-1.Möchten Sie vielleicht zu Lesen, auf Python und Unicode:
Den Python-Unicode-HOWTO
Pragmatische Unicode von Ned Batchelder
Das Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) von Joel Spolsky
myinsert = [ { "name" : u"Bientôt l'été", "id" : 1 } ]
anschaut und dann die MySQL-Datenbank-es liest sich wieBientôt l'été
das ist, was ich will (außer ich will, dies zu tun für eine string-variable zBmystring
). Würde dies nicht empfehlen, nicht ein problem angezeigt?mystring
eineunicode
Objekt in Erster Linie:mystring = u"Bientôt l'été"
.encode()
nicht sinnvoll, und könnte sehr gut sein, die denn zu Ihrem problem.mystring
ein unicode-Objekt. Ich weiß, ich kann es mitmystring = u"help!"
aber ich weiß nicht, wie Sie dies tun, wenn "Hilfe!", stammen aus einer anderen Variablen oder Wörterbuch zum Beispiel. Ich habe versucht, unicode (), aber dies scheint nicht zu arbeiten, und ich weiß nicht, ob dies das richtige war zu tun oder nicht.unicode
schon..decode()
statt und ich kam mit dieser Fehlermeldung, wenn mit einem anderen string:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 8: ordinal not in range(128)
als ich versuchte, diese Zeichenfolge:Bookworm™ Adventures
. Es ist klar, beschwerte sich über die "TM" - Zeichen, aber ich bin wirklich verwirrt..decode()
? Python dann versucht zu codieren, dieunicode
Objekt wieder zu Ihrem terminal entsprechen, dass das nicht immer funktioniert. Die decode gearbeitet..decode()
sagte ich.decode('utf8')
..con.set_character_set('utf8') cur.execute('SET NAMES utf8;') cur.execute('SET CHARACTER SET utf8;') cur.execute('SET character_set_connection=utf8;')
INSERT
für eineunicode
literal (u'something'
) war arbeiten, aber ich sehe jetzt, dass Sie nur ASCII-codepoints in diesem Wert.