Mysql "illegal mix of collations" ERROR

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Hallo,

ich habe wiedermal ein Kodierungs Problem, mit dem ich alleine nicht weiter komme. Ich mache eine MySQL Select Abfrage mit mysqldb, die auf Windows wie Linux laufen soll. Bei der Mysql Tabelle ist als Collation "latin1 - default collation" eingestellt.

Mein Skript schaut verkürzt wie folgt aus:

Code: Alles auswählen

self.db = MySQLdb.connect(host=self.VdrHOST, user=self.MysqlUser, passwd=self.MysqlPass,db=self.MysqlDB, use_unicode=0)
self.cursor = self.db.cursor()
self.cursor.execute(u"SELECT * FROM TestTimer WHERE Timer LIKE %s AND User LIKE %s",(RoheDataSpl[1].encode("latin1",'replace'),Userid.encode("latin1",'replace')))
result = self.cursor.fetchall()
Nun zu dem, was ich absolut nicht verstehe: Unter Windows läuft das einwandfrei. Unter Linux wirft es folgenden Fehler für die Select Abfrage aus:

Code: Alles auswählen

_mysql_exceptions.OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'")
Kann mir da jemand helfen und mir erklären woher dieses Problem kommt und wie ich es lösen kann?

Vielen Dank!
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Mal unabhängig von Codierungen: bist du dir sicher, dass du hier ein LIKE verwenden möchtest?
LIKE prüft ob eine Zeichenkette in einer anderen enthalten ist, und dafür braucht man auch noch "Jokerzeichen", die du hier nicht verwendest.
Mit = prüft man auf Übereinstimmung.
Vielleicht löst das schon dein Problem.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Ja, ich brauche hier LIKE, weil LIKE der Operator für String Vergleiche auf Zeichenbasis ist. Siehe:
http://dev.mysql.com/doc/refman/5.1/de/ ... tions.html
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Habe es endlich raus bekommen. In Linux wurde die MYSQL Connection mit utf8 gestartet und in Windows mit latin1. Da ich in Linux die Strings nach latin1 kodiert habe, hat es dann diesen Fehler gegeben. Verstehen tue ich es immer noch nicht ganz, weil ich laut der Fehlermeldung angenommen hätte, dass innerhalb meiner SELECT Kodierungen vermischt sind. Wenn also mehr dazu weiß, bin ich dankbar, wenn er dies noch zum Besten gibt.

Jedenfalls kann man so prüfen, mit welcher Kodierung die Connection aufgebaut wird und sie auch ändern:

Code: Alles auswählen

self.db = MySQLdb.connect(host=self.VdrHOST, user=self.MysqlUser, passwd=self.MysqlPass,db=self.MysqlDB)
self.cursor = self.db.cursor()
print self.db.character_set_name()
self.db.set_character_set("latin1")
print self.db.character_set_name()
Antworten