wake-up-neo.net

Unzulässige Mischung von Kollatierungen (utf8_general_ci, IMPLICIT) und (utf8_unicode_ci, IMPLICIT) innerhalb der gespeicherten Prozedur

  1. Alle Tabellen sind in utf_unicode_ci.

    Ich habe das getan, um zu überprüfen

    SELECT table_schema, table_name, column_name, character_set_name, collation_name
        FROM information_schema.columns
    WHERE collation_name <> 'utf8_unicode_ci' AND table_schema LIKE 'my_database'
        ORDER BY table_schema, table_name, ordinal_position;
    

    Und jeden Tisch für alle Fälle konvertiert

    ALTER TABLE `my_database`.`table_name` DEFAULT COLLATE utf8_unicode_ci;      
    ALTER TABLE `my_database`.`table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;         
    
  2. Meine Einstellungen für die Datenbanksortierung befinden sich in utf8_unicode_ci.

    zeichensätze sind

     mysql> zeige Variablen wie 'char%'; 
     + -------------------------- + - -------------------------- + 
     | Variablenname | Wert | 
     + -------------------------- + --------------- ------------- + 
     | character_set_client | utf8 | 
     | character_set_connection | utf8 | 
     | character_set_database | utf8 | 
     | character_set_filesystem | binär | 
     | character_set_results | utf8 | 
     | character_set_server | utf8 | 
     | character_set_system | utf8 | 
     | character_sets_dir |/usr/share/mysql/charsets/| 
     + -------------------------- + ------- --------------------- + 
     8 Reihen im Satz (0,02 Sek.)

    sortierungen sind

    mysql> zeige Variablen wie 'colla%'; 
     + ---------------------- + ----------- ------ + 
     | Variablenname | Wert | 
     + ---------------------- + ----------------- + 
     | Kollatierungsverbindung | utf8_unicode_ci | 
     | collation_database | utf8_unicode_ci | 
     | Kollatierungsserver | utf8_unicode_ci | 
     + ---------------------- + ----------------- + 
     3 Reihen im Satz (0,00 Sek.)
  3. der Fehler wird ausgelöst, wenn ich die gespeicherte Prozedur über einen Webbrowser oder über den Mysql-Bash-Client aufrufen. Nur für den Fall, dass meine Gebietsschemaeinstellungen für Ubuntu/Linux wie folgt sind:

    $ locale 
     LANG = es_ES.UTF-8 
     LANGUAGE = es_ES.UTF-8 
     LC_CTYPE = es_ES.UTF-8 
     LC_NUMERIC = "es_ES.UTF- 8 "
     LC_TIME =" es_ES.UTF-8 "
     LC_COLLATE = es_ES.UTF-8 
     LC_MONETARY =" es_ES.UTF-8 "
     LC_MESSAGES = es_ES .UTF-8 
     LC_PAPER = "es_ES.UTF-8" 
     LC_NAME = "es_ES.UTF-8" 
     LC_ADDRESS = "es_ES.UTF-8" 
     LC_TELEPHONE = "es_ES.UTF-8" 
     LC_MEASUREMENT = "es_ES.UTF-8" 
     LC_IDENTIFICATION = "es_ES.UTF-8" 
     LC_ALL =

Die einzige Möglichkeit, dieses Problem zu lösen, besteht in der Verwendung von convert in jeder Abfrage, die den Fehler verursacht (oder der Verwendung von COLLATE in der Abfrage). Das Problem ist jedoch, dass es viele recht komplexe gespeicherte Prozeduren gibt, die schwer zu identifizieren sind das "schlechte" fragt ab und braucht viel Zeit.

Ich vermute, dass die Variablen, die von meinem System (ubuntu: mysql client, browser) an die gespeicherte Prozedur übergeben werden, in utf8_general_ci gesendet werden, sodass es zu Konflikten mit ut8_unicode_ci aus meiner Datenbank kommt. 

Es scheint, dass das Betriebssystem mit utf8_general_ci arbeitet, obwohl die mysql-Verbindung auf utf_unicode_ci gesetzt ist.

13
Packet Tracer

Ich habe mein Problem gelöst und war aufgrund einer falschen Konvertierung während der Migration nicht in utf8_unicode_ci, sondern in utf_general_ci konvertiert. Obwohl die Datenbankstruktur von mysql korrekt ist, wurden die Quelldaten in der falschen Codierung (utf8_general_ci) codiert und in die mysql ddbb eingefügt dieser Weg.

Die Sache ist also, dass Sie den richtigen Zeichensatz und die richtige Sortierung in Ihrer mysql-Datenbank haben können und trotzdem den Fehler "Ungültige Mischung aus Sortierungen" erhalten, da die Daten mit einer anderen Sortierung versehen sind.

Hoffe, das hilft jemandem in der Zukunft.

17
Packet Tracer

falls es jemandem hilft, hatten wir den gleichen Fehler bei einer Abfrage in verschiedenen Datenbanken verschiedener Server. Der Fehler war eine Migration von einem anderen Server. In unserem Fall wurde dies behoben, indem der "collation_server" in mysql.ini geändert und der mysql-Dienst neu gestartet wurde.

2
ohcnim

Wenn Sie gespeicherte Prozeduren und gespeicherte Funktionen erneut importieren, sobald Sie die richtigen Einstellungen für die Kodierung und Sortierung vorgenommen haben, werden die Probleme behoben. Läuft in genau das gleiche Problem. Eine weitere hilfreiche mysql-Funktion zur Fehlerbehebung: Wählen Sie die Kollatierung (some_col) aus some_table aus, wenn Sie Probleme mit Ihrem Tabellendatenformat vermuten.

1
ymgoldman

Ich habe mein Problem gelöst, nachdem ich den CHARSET utf8 in einer Parameterliste hinzugefügt habe. kann dies helfen, voll zu anderen,


   PROCEDURE `USP_USR_AuthenticateUser`(
      IN ip_username VARCHAR(50) CHARSET utf8**,
      IN ip_pwd NVARCHAR(256)
   )
0
murlid05