ich die folgende Fehlermeldung von einem Java/Frühjahr/Hibernate-Anwendung empfängt, wenn es eine vorbereitete Anweisung für eine MySQL-Datenbank auszuführen versucht:Woher kommt die Kollatierung "latin1_german1_ci"?
Caused by: java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin1_german1_ci,COERCIBLE) for operation '='
Die select-Anweisung, die diese erzeugt (wie in der tomcat gezeigt log) ist:
SELECT s.* FROM score_items s where
s.s_score_id_l=299 and
(s.p_is_plu_b = 'F') and
isTestProduct(s.p_upc_st) = 'N' and
v_is_complete_b='T'
order by s.nc_name_st, s.p_upc_st
die Tabelle Sortierungs pro dem show table status
Befehl lautet:
utf8_general_ci
Die Sortierung für alle Felder char, varchar und text lautet "utf8_general_ci
". Es ist null für die Bigint-, Int- und Datetime-Felder.
Die Datenbankkollatierungs sind latin1_swedish_ci
wie durch den Befehl angezeigt:
show variables like "collation_database";
Edit: mit Eclipse/STS und Tomcat 6 Instanz ich in der Lage war erfolgreich dies von meinem lokalen Rechner laufen zu lassen. Der lokale Prozess liest die Daten aus derselben Datenbank wie der Prozess auf dem Produktionsserver, der den Fehler verursacht hat. Der Server, auf dem der Fehler auftritt, ist eine Tomcat 7.-Instanz ist ein Amazon Linux-Server.
Edit 2: Ich konnte den Bericht auch erfolgreich ausführen, wenn ich ihn aus unserer QA-Umgebung ausführte. Die JDBC-Anweisung in server.xml wurde auf die Produktionsdatenbank zurückgesetzt. QA ist im Wesentlichen ein Spiegel der Produktionsumgebung, mit einigen Entwicklerarbeiten. Ich sollte auch bemerken, dass ich letzten Monat einen ähnlichen Fehler gesehen habe, aber er verschwand, als ich den Bericht erneut verfasste. Schließlich bin ich nicht sicher, warum es einen Unterschied machen würde, aber der abgefragte Tisch ist riesig, mit über 7 Millionen Zeilen und wahrscheinlich 100 Feldern pro Zeile.
Edit 3: Basierend auf Shadows Kommentaren entdeckte ich, dass der Zeichensatz "latin1" in der Testfunktion angegeben wurde. Ich habe das zu utf8 geändert und hoffe, dass dies das Problem löst.
Wie finde ich heraus, welches Feld "latin1_german1_ci
" ist?
Warum ist der Vergleich „latin1_swedish_ci
“, wenn die Tabelle und Felder sind entweder "utf8_general_ci
oder null?
könnte das Problem im Zusammenhang Zeichensatz funktionieren verwenden, und wenn ja, wie kann ich feststellen, welchen Zeichensatz/Sortier ist es mit?
Wie ich welches Feld einzuengen tun/Funktion das Problem verursacht?
Danke, das ist eine sehr gute Info. Ich arbeite immer noch daran. Es ist sehr seltsam, dass es sowohl von meiner Maschine als auch von der QA-Umgebung funktioniert, wenn es auf die Prod-db gerichtet ist (siehe meine zweite Bearbeitung oben). –
Deshalb glaube ich, dass das Problem mit der Verbindungskollation ist. Sie können es in der Verbindungszeichenfolge angeben. – Shadow
Ich gab endlich den Geist auf und startete die App neu und es funktionierte. Ich habe keine Idee warum. Vielen Dank! –