2017-09-08 4 views
0

Heute verursacht, von Java-Ingenieur zu mir kommen, und zeigen Sie mir einen Fehler:JDBC Probleme NAMES SET utf8 Illegal Mix von Sortierungen

select * from some_table where name=? ... 
### Cause: java.sql.SQLException: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 

Die Standard-charset utf8 ist und collate ist utf8_general_ci, die charset für Spalte name ist utf8mb4 und collate ist utf8mb4_unicode_ci und der Wert für die Spalte 'name' ist ein utf8mb4-Wert (einschließlich Emoji).

So überprüfte ich die Datenbankkonfiguration und gefunden:

character_set_client=utf8 
character_set_connection=utf8 
character_set_server=utf8 

Also, ich denke, es ist einfach, diesen Fehler zu beheben:

set global character_set_server=utf8mb4; 
set global collation_server=utf8mb4_unicode_ci; 
set global init_connect='SET NAMES utf8mb4' 

Aber nach dem Neustart des Java-Programm, der Fehler immer noch da! So aktiviert i das allgemeine Protokoll in den MySQL-Server, und fand sehr seltsam SQL-Anweisung:

4584243 Connect [email protected] on some_database 
4584243 Query SET NAMES utf8mb4  # this is the result for the init_connect. 
Query /* mysql-connector-java-5.1.35 (Revision: 
5fb9c5849535c13917c2cf9baaece6ef9693ef27) */SHOW VARIABLES WHERE 
Variable_name ='language' OR Variable_name = 'net_write_timeout' OR 
Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR 
Variable_name = 'character_set_client' OR Variable_name = 
'character_set_connection' OR Variable_name = 'character_set' OR 
Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR 
Variable_name = 'transaction_isolation' OR Variable_name = 
'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 
'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 
'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR 
Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR 
Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR 
Variable_name = 'license' OR Variable_name = 'init_connect' 
4584243 Query /* mysql-connector-java-5.1.35 (Revision: 
5fb9c5849535c13917c2cf9baaece6ef9693ef27) */SELECT 
@@session.auto_increment_increment 
4584243 Query SELECT @@session.autocommit 
4584243 Query SET NAMES utf8  # Who issued this? 
4584243 Query SET character_set_results = NULL 
4584243 Query SET autocommit=1 
4584243 Query select @@session.tx_read_only 
4584243 Query SELECT @@session.tx_isolation 
4584243 Query select * from some_table where name = 'xxxx' # OK, now normal business SQL statement starts 

Es ist deutlich zu erkennen, dass es eine SQL ist:

4584243 Query SET NAMES utf8  # JDBC issued this 

Diese SQL verursacht meine Verlegenheit zu verlieren bewirken. Wer oder welches Framework wird diese Art von SQL ausgeben, wie kann es deaktiviert werden?

Jeder Vorschlag wird begrüßt.

Aktualisiert: Ich denke, es ist nicht JDBC ist aber MySQL-Server dieses Problem verursacht, als wenn ich nativen JDBC verwenden, um einen anderen Server mit init_connect = ‚gesetzt Namen utf8mb4‘ verbinden, die charset Client-Verbindung wird richtig utf8mb4, ich habe keine Ahnung, warum es für diesen MySQL-Server nicht funktioniert. Beide Server haben die gleiche Konfiguration für Zeichensatz und Kollation.

Aktualisiert: Nach dem Neustart von MySQL-Server ist das Problem verschwunden! Es gibt möglicherweise einen Fehler in Connector J oder MySQL Server, da das Dokument besagt, dass character_set_server und collation-server dynamische Optionen sind, aber nicht für alle Clients gilt: Es funktioniert für den nativen mysql-Client, aber nicht für Connector J.

+0

Es gibt auch die Verbindungszeichenfolge in mysql, wo "utf8" normalerweise festgelegt ist. –

Antwort

0

Aktualisiert: Die Option character_set_server ist nicht dynamisch wie das Dokument sagt, aber Sie können umgehen, indem Sie connectionCollation = utf8mb4_unicode_ci zu jdbc config string hinzufügen oder einfach Ihren MySQL-Server neu starten, was in manchen Fällen nicht akzeptabel ist.

Verwandte Themen