Partage
  • Partager sur Facebook
  • Partager sur Twitter

1366 Incorrect string value: '\x8C\x8F8\xA0'

Sujet résolu
    10 juillet 2019 à 1:14:20

    Bonsoir à tous,

    Je sais que cette questions à était posé beaucoup de fois, pour avoir suivi les topiques sans résultat.

    Voilà pourquoi je vient vers vous posé ma question comment réglé se foutu problème mais données ne son apparemment pas en utf8

    SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\x8C\x8F8\xA0' for column 'selector'

    j'ai donc supprimer ma base pour la récréer en utf8_general_ci puis en utf8_unicode_ci et idem en utf8mb4 puis en latin1 mais rien ne change

    et fait la même chose avec la table et le champs idem rien enfin si des fois j'ai une deuxième erreurs :)

    Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation '='

    j'ai aussi toucher les fichiers de configuration comme dis dans certain topique notamment le fichier my.ini, httpd.h.

    voilà cela fait une semaine que j'écume le web a la recherche d'une solution, merci pour vos réponses

    ps: j'ai mysql en ligne de commande si sa peux servir.

    • Partager sur Facebook
    • Partager sur Twitter
    Tout se sait un jour, il suffit de l'apprendre !
      10 juillet 2019 à 9:13:39

      Bonjour,

      Dans quel contexte intervient cette erreur ?

      Tu essayes de lire un fichier ? Un formulaire HTML ?

      Peux-tu nous donner les CREATE TABLE impliqués ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        10 juillet 2019 à 13:05:48

        bonjour,

        je créer une base le plus simplement du monde avec la commande

        CREATE DATABASE sosies;

        et la table avec

        CREATE TABLE `auth_tokens`(
        	`id` smallint(5) UNSIGNED AUTO_INCREMENT,
        	`selector` varchar(20),
        	`expires` DATETIME,
        	`users_id` smallint(5) UNSIGNED,
        	`token` varchar(64),
          
        	PRIMARY KEY (`id`),
        	UNIQUE (`selector`)
        );

        cette erreur vient d'une fonction que voici

        // Remember me (se souvenir de moi)
        if(!function_exists('remember_me')){
        	function remember_me($users_id){
        		
        		global $db;
        		
        		$token = openssl_random_pseudo_bytes(24);
        		
        		
        		do{
        			$selector = openssl_random_pseudo_bytes(9);
        			
        		}while(cell_count('auth_tokens', 'selector', $selector) > 0 );
        		
        		//die($token.' Nombre caracteres: '. strlen($token).'<br />'. $selector. ' Nombre caracteres: '. strlen($selector));
        		
        		$q = $db->prepare('INSERT INTO auth_tokens(expires, selector, users_id, token)
        							VALUES(DATE_ADD(NOW(), INTERVAL 14 DAY), :selector, :users_id, :token)');
        							
        		$q->execute([
        			':selector' => $selector,
        			':users_id' => $users_id,
        			':token' 	=> hash('sha256', $token)
        			
        		]);
        		
        			
        	}
        }	


        puis sur ma page index.php j'appel cette fonction avec un id

        remember_me(1)


        merci pour votre aide.

        • Partager sur Facebook
        • Partager sur Twitter
        Tout se sait un jour, il suffit de l'apprendre !
          10 juillet 2019 à 13:22:20

          On ne voit pas l'encodage (et collation) des colonnes selector et token.

          Quel est l'encodage de tes fichiers PHP (index et celui contenant tes fonctions) ?

          Quel encodage donnes-tu à PDO lors de ta connexion ?

          -
          Edité par Benzouye 10 juillet 2019 à 13:22:57

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            10 juillet 2019 à 15:19:48

            merci pour ta patience,

            voici la base (que je veux peux supprimer à volonté idem pour la table)

            voici la table 

            voici mon <header>

            <head>
                
            	<meta charset="utf-8" />


            voici ma connexion a la base

            <?php
            //Identifient de connexion
            define('DB_HOST', 'localhost');
            define('DB_NAME', 'sosies');
            define('DB_CHARSET', 'utf8');
            define('DB_USERNAME', 'root');
            define('DB_PASSWORD', 'root');
            
            try{
            	$db = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, DB_USERNAME, DB_PASSWORD);
            	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
            	
            } catch(PDOException $e){
            	$msg = 'ERREUR : ' . $e->getFile() . ' Linge n .' . $e->getLine() . ' : ' . $e->getMessage();
                die($msg);
            	
            }


            j'ai installer WAMPServer le wamp fait par Artemus24 léger et mise à jour par sois même   https://www.jcz.fr/

            mes version son les suivante:

            Composant | Version

            --------------------

            WampServer2.6

            Apache2.4.39

            Php7.3.7

            Mysql8.0.16

            PhpMyAdmin4.9.0.1

            PhpSysInfo3.3.1


            j'ai accès a tous les fichiers de configuration si besoin

            • Partager sur Facebook
            • Partager sur Twitter
            Tout se sait un jour, il suffit de l'apprendre !
              10 juillet 2019 à 16:58:25

              J'ai recrée quasiment le même environnement que toi et je n'ai aucun problème d'encodage, pas d'erreur MySQL, je récupères bien les hash SSL dans ma table et il les affiche correctement ...

              La seule différence c'est la fonction cell_count que je n'ai pas mise car je n'ai pas le code associé ...

              Que se passe-t-il dans cette fonction ?

              -
              Edité par Benzouye 10 juillet 2019 à 16:58:43

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                10 juillet 2019 à 20:28:41

                merci pour ta réponse désoler d'voir était long

                pour la fonction la voici: c'est juste une fonction qui sa chercher si la valeur ne se trouve pas déjà dans la table

                je sais sa fait doublon avec le champ UNIQUE 

                if(!function_exists('cell_count')){
                	function cell_count($table, $field_name, $field_value){
                		global $db;
                		
                		$q = $db->prepare("SELECT * FROM $table WHERE $field_name = ?");
                		$q ->execute([$field_value]);
                		
                		return $q->rowCount();
                	}
                }	



                • Partager sur Facebook
                • Partager sur Twitter
                Tout se sait un jour, il suffit de l'apprendre !
                  11 juillet 2019 à 11:25:59

                  Oui en effet, rien d'embêtant dans ta fonction ...

                  Vérifies l'encodage des fichiers PHP impliqués, avec ton éditeur de texte préféré (style notepad++), pour t'assurer que c'est bien aussi UTF-8, même si je ne vois pas pourquoi cela poserait problème ...

                  La base, ses tables et leurs colonnes ont une collation normale, PDO est configuré normalement, le fichier HTML a une entête normale ...

                  J'ai testé chez moi, et cela fonctionne en l'état ...

                  Je ne vois pas où cela peut merder ... Peut-être que Julp aura une idée, je lui envoie un MP ;)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    11 juillet 2019 à 11:52:41

                    > define('DB_CHARSET', 'utf8');

                    Déjà, ce devrait être utf8mb4 pour être raccord avec le reste.

                    Ensuite, à voir si ça vient de là mais openssl_random_pseudo_bytes renvoie des octets quelconques, ce n'est certainement pas de l'UTF-8 ... Il faudrait encoder ça avec bin2hex ou autre base64. Et encore, même sous cette forme, j'aurais utilisé un type binaire (TINYBLOB ou VARBINARY)

                    > j'ai aussi touché les fichiers de configuration comme dit dans certains topics notamment le fichier my.ini, httpd.h

                    Modifier httpd.h ne servira strictement à rien, il est utilisé à la compilation pas au runtime. De toute façon, Apache ne joue strictement aucun rôle là-dedans.

                    -
                    Edité par julp 11 juillet 2019 à 11:55:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 juillet 2019 à 13:17:04

                      Bonjour et merci pour vos réponses

                      j'ai testé le VARBINARY et parfait j'ai mis un petit die() après mon insertion dans la base et mon navigateur me renvoi

                      le selector : qGr¨âMgþ
                      le token : ˆ¬ŸôÖ6Ôë<¸¯£k]þ—Jïéj


                      et ma base enregistre les infos


                      merci a vous 2

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Tout se sait un jour, il suffit de l'apprendre !
                        11 juillet 2019 à 14:00:10

                        Pour info je n'avais pas de problème avec un VARCHAR "normal" ... C'est étonnait que les bytes ne soient pas accepté dans ton environnement ...

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          11 juillet 2019 à 16:29:51

                          > SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\x8C\x8F8\xA0' for column 'selector'

                          Est parfaitement logique et légitime vu ce que openssl_random_pseudo_bytes génère (pour le selector vu qu'il n'y a ni hachage ou bin2hex/base64 entre son appel et l'insert).

                          > Pour info je n'avais pas de problème avec un VARCHAR "normal" ... C'est étonnait que les bytes ne soient pas accepté dans ton environnement ...

                          Au contraire, c'est étonnant que ce soit passé lors de tes tests à vrai dire. A moins d'avoir eu du bol de générer une chaîne +/- valide ? (on peut exclure la connexion pas en utf8, je suppose)

                          > Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation '='

                          Je comprenais pas cette erreur au départ mais je suppose que ça date de quand il a fait des tests avec du latin1 (après sans l'avoir remis dans son contexte, difficile de lier les choses)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 juillet 2019 à 23:17:45

                            > Pour info je n'avais pas de problème avec un VARCHAR "normal" ... C'est étonnait que les bytes ne soient pas accepté dans ton environnement ..

                            est ce que la version de php y est pour quelque chose ? Benzouye   A tu la même version que moi ?

                            >> Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation '='

                            Tu as tout a fait raison julp c'était pour les tests

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Tout se sait un jour, il suffit de l'apprendre !
                              12 juillet 2019 à 0:11:22

                              > est ce que la version de php y est pour quelque chose ?

                              J'en doute. A moins vraiment que libmysql (tonydu76) vs mysqlnd (Benzouye) joue ? Ce qui impliquerait que ce soit la partie cliente qui intervienne, ce qui ne me paraîtrait pas hyper logique de prime abord.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              1366 Incorrect string value: '\x8C\x8F8\xA0'

                              × 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