Seite 1 von 1

Mysql "illegal mix of collations" ERROR

Verfasst: Dienstag 15. Januar 2013, 08:35
von Stolzi
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!

Re: Mysql "illegal mix of collations" ERROR

Verfasst: Dienstag 15. Januar 2013, 11:15
von sparrow
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.

Re: Mysql "illegal mix of collations" ERROR

Verfasst: Dienstag 15. Januar 2013, 11:35
von Stolzi
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

Re: Mysql "illegal mix of collations" ERROR

Verfasst: Dienstag 15. Januar 2013, 12:03
von Stolzi
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()