web-dev-qa-db-fra.com

Mélange illégal de classements (utf8_general_ci, IMPLICIT) et (utf8_unicode_ci, IMPLICIT) dans une procédure stockée

  1. Toutes les tables sont en utf_unicode_ci.

    J'ai fait ça pour vérifier

    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;
    

    Et converti chaque table au cas où

    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. Les paramètres de classement de ma base de données sont dans utf8_unicode_ci.

    les jeux de caractères sont

     mysql> affiche des variables telles que 'char%'; 
     + -------------------------- + - -------------------------- + 
     | Nom_variable | Valeur | 
     + -------------------------- + --------------- ------------- + 
     | character_set_client | utf8 | 
     | character_set_connection | utf8 | 
     | character_set_database | utf8 | 
     | character_set_filesystem | binaire | 
     | character_set_results | utf8 | 
     | character_set_server | utf8 | 
     | character_set_system | utf8 | 
     | character_sets_dir |/usr/share/mysql/charsets/| 
     + -------------------------- + ------- --------------------- + 
     Ensemble de 8 lignes (0.02 sec)

    les collations sont

    mysql> affiche des variables comme 'colla%'; 
     + ---------------------- + ----------- ------ + 
     | Nom_variable | Valeur | 
     + ---------------------- + ----------------- + 
     | collation_connection | utf8_unicode_ci | 
     | collation_database | utf8_unicode_ci | 
     | serveur_collation | utf8_unicode_ci | 
     + ---------------------- + ----------------- + 
     Ensemble de 3 lignes (0.00 sec)
  3. l'erreur est déclenchée si j'appelle la procédure stockée via un navigateur Web ou via le client mysql bash. juste au cas où mes paramètres régionaux ubuntu/linux sont:

    $ 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 =

La seule façon pour moi de résoudre ce problème consiste à utiliser convert dans chaque requête à l'origine de l'erreur (ou à utiliser COLLATE dans la requête), mais le problème est qu'il existe de nombreuses procédures stockées assez complexes et qu'il est donc difficile de les identifier. les "mauvaises" requêtes et prend beaucoup de temps.

J'imagine que les variables transmises à la procédure stockée depuis mon système (ubuntu: client mysql, navigateur) sont envoyées dans utf8_general_ci, ce qui crée un conflit avec ut8_unicode_ci depuis ma base de données. 

Il semble que le système d'exploitation fonctionne avec utf8_general_ci même si la connexion mysql est définie sur utf_unicode_ci.

13
Packet Tracer

J'ai résolu mon problème, et cela était dû à une conversion incorrecte au cours de la migration. J'étais en train de convertir utf_general_ci au lieu de utf8_unicode_ci. Par conséquent, bien que la structure de la base de données mysql soit correcte, les données source étaient codées dans le mauvais encodage (utf8_general_ci) et insérées dans le mysql ddb de cette façon.

Le problème est donc que vous pouvez avoir le bon jeu de caractères et le bon classement dans votre base de données mysql tout en obtenant l'erreur "Mélange illégal de classements", car les données sont entourées d'un autre classement.

J'espère que cela aidera quelqu'un à l'avenir.

17
Packet Tracer

au cas où cela aiderait quelqu'un, nous avions la même erreur en effectuant une requête dans différentes bases de données de différents serveurs, l'un avec l'erreur étant une migration de l'autre. Dans notre cas, cela a été corrigé en modifiant le "serveur de collation" dans mysql.ini et en redémarrant le service mysql.

2
ohcnim

La réimportation des procédures et des fonctions stockées une fois que vous avez défini correctement les paramètres de codage et de classement résoudra les problèmes. Couru dans le même problème exact. Une autre fonction utile de mysql native pour le dépannage: sélectionnez collation (some_col) dans some_table, si vous suspectez des problèmes avec le format de vos données de table.

1
ymgoldman

J'ai résolu mon problème après avoir ajouté CHARSET utf8 dans une liste de paramètres. peut-être cela aidera plein à d'autres,


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