Partage
  • Partager sur Facebook
  • Partager sur Twitter

{MySQL] Mauvais charset lors de la création de vue

Sujet résolu
    28 février 2022 à 11:43:51

    Bonjour,

    J'ai créé plusieurs vues dans ma BDD, et certaines ajoutent des "champs" vides.
    Un extrait d'une requête de création de vue très, très simplifiée bien sûr. :)

    SELECT
    	nom AS ville,
    	'' AS cedex
    FROM
    	matable


    "nom" est bien en utf8mb4_general_ci, mais "cedex" est lui en "utf8mb4_unicode_ci".

    Vous aurez deviné ma question : Je ne trouve pas comment mettre ce champ aussi en utf8mb4_general_ci, car à cause de ça j'ai droit à des "illegal mix of collation"...

    Merci ! :)

    • Partager sur Facebook
    • Partager sur Twitter
      28 février 2022 à 13:28:58

      Bonjour,

      Je ne comprends pas ... Dans l'exemple donné, cedex n'est pas une colonne ... il n'y a pas de "collation" définie dessus donc, si ce n'est celle définie lors de la connexion à MySQL.

      Par ailleurs il ne devrait pas y avoir de problème de "mix of collation" si tout est en utf8 ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        28 février 2022 à 16:07:09

        Faut que je regarde du côté du charset défini lors de la connexion à la BDD car sauf erreur de ma part c'est bien aussi du utf8mb4_general_ci, c'est ce que je ne comprenais pas...
        • Partager sur Facebook
        • Partager sur Twitter
          28 février 2022 à 17:36:09

          Tout cela est de l'UTF-8 ... Tu ne devrais pas avoir de problème de collation ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            1 mars 2022 à 11:50:35

            Voici ce que j'ai pourtant comme message : "#1267 - Illegal mix of collations (utf8mb4_general_ci,COERCIBLE) and (utf8mb4_unicode_ci,COERCIBLE) for operation '='"

            L'interclassement pour la connexion au serveur est par défaut en utf8mb4_unicode_ci.
            Sur PHPMyAdmin, si je le passe en utf8mb4_general_ci je n'ai plus de problème et je l'ai passé ainsi sur la connexion du site web.

            J'ai par contre le souci avec MySQLDump du coup qui doit être soumis au même problème car le fichier généré s'arrête à cette vue.
            Je n'ai plus qu'à changer ça dans la configuration par défaut de MySQL... et trouver où changer ça. :)

            EDIT> Je viens de voir qu'on peut préciser le default-character-set sur un mysqldump, je vais donc tester ça.

            Merci pour tes indications !

            -
            Edité par jouvrard 1 mars 2022 à 12:00:58

            • Partager sur Facebook
            • Partager sur Twitter
              1 mars 2022 à 12:00:27

              Le bout d'erreur indiquée :

              jouvrard a écrit:

              #1267 - Illegal mix of collations (utf8mb4_general_ci,COERCIBLE) and (utf8mb4_unicode_ci,COERCIBLE) for operation '='"

              Concerne je présume une condition WHERE colonne = ... où une condition de jointure JOIN ... ON ... = ...

              Je pense qu'il faut vérifier où l'erreur apparaît précisément, et ensuite vérifier côté MySQL :

              • L'encodage des colonnes concernées dans la ou les tables concernées
              • L'encodage des tables concernées

              Peux-tu poster l'erreur entière ? Avec la requête entière ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                1 mars 2022 à 14:37:14

                Voici un exemple avec une petite requête:

                SELECT
                        VM.annee AS annee,
                        VM.mois AS mois,
                        CF.contrats_id AS contrats_id,
                        MAX(termine),
                        SUM(ifnull(CF.facturation,0)) AS facturation
                    FROM
                        vue_mois VM
                    LEFT JOIN
                        contrats_facturation CF ON concat(VM.annee,VM.mois) = date_format(CF.date,'%Y%m')
                    GROUP BY
                        VM.annee,
                        VM.mois,
                        CF.contrats_id

                La vue "vue_mois" :

                La vue "vue_mois"

                La table "contrats_facturation":

                contrats_facturation

                C'est bien la jointure qui pose problème, mais je ne vois que du utf8mb4_general_ci.

                L'erreur : #1267 - Illegal mix of collations (utf8mb4_general_ci,COERCIBLE) and (utf8mb4_unicode_ci,COERCIBLE) for operation '='

                Il n'aime pas la comparaison de la jointure.
                La requête va peut-être te dire quelque chose car tu m'avais aidé sur des requêtes il y a quelque temps de ça, et celle-ci en faisait partie. :)

                -
                Edité par jouvrard 1 mars 2022 à 14:43:05

                • Partager sur Facebook
                • Partager sur Twitter
                  1 mars 2022 à 17:12:10

                  Je ne comprends pas pourquoi il cherche à utiliser utf8mb4_unicode_ci ... ma limite de compétence est dépassée ...

                  Par contre, pour cet exemple précis, tu devrais essayer ainsi :

                  SELECT
                  	VM.annee AS annee,
                  	VM.mois AS mois,
                  	CF.contrats_id AS contrats_id,
                  	MAX(termine),
                  	SUM(ifnull(CF.facturation,0)) AS facturation
                  FROM
                  	vue_mois VM
                  		LEFT JOIN contrats_facturation CF
                  			ON VM.annee = YEAR( CF.date )
                  			AND VM.mois = MONTH( CF.date )
                  GROUP BY
                  	VM.annee,
                  	VM.mois,
                  	CF.contrats_id

                  PS : Pourquoi stocker année et mois dans des VARCHAR ???

                  Perso j'aurais fait deux tables (année et mois) avec une colonne en SMALLINT UNSIGNED.

                  -
                  Edité par Benzouye 1 mars 2022 à 17:15:48

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    2 mars 2022 à 10:33:41

                    Ca fonctionne en "éclatant" la comparaison, nickel.

                    Pour le reste, je ne vois pas non plus... Après si le problème est contourné c'est déjà bien. :)

                    Merci !

                    Pour mois/année dans du varchar j'avais repris ce qu'on avait vu ensemble il y a un certain temps maintenant.
                    Je vais changer ça car en effet ça n'a aucun intérêt.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    {MySQL] Mauvais charset lors de la création de vue

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown