web-dev-qa-db-fra.com

Format de date/heure incorrect: 1366 Valeur de chaîne incorrecte

Je reçois cette erreur:

SQLSTATE [22007]: Format de date/heure non valide: 1366 Valeur de chaîne incorrecte: '\ xBD Inch ...' pour la colonne 'nom de colonne' à la ligne 1

Ma base de données, ma table et ma colonne ont le format utf8mb4_unicode_ci aussi nom-colonne est de type text et NULL.

C'est la valeur du nom de colonne

[nom-colonne] => Du texte avant 11 et un autre texte après et après.

Cependant, j'attends que laravel ajoute des guillemets aux valeurs de la colonne, car les valeurs sont séparées par des virgules (,). Ce devrait être comme suit:

[nom de colonne] => 'Du texte avant 11 et un autre texte après et après.'

Voir ci-dessous le schéma

    Schema::create('mws_orders', function (Blueprint $table) {
        $table->string('custom-id');
        $table->string('name');
        $table->string('description')->nullable();
        $table->string('comment')->nullable();
        $table->integer('count')->nullable();
        $table->text('column-name')->nullable();
        $table->timestamps();

        $table->primary('custom-id');
    });

Je cherchais sur google mais pas encore de solution.

Quelqu'un a une idée comment résoudre ce problème?

J'utilise Laravel 5.5 et MariaDB 10.2.11.

5
omixam

Je l'ai résolu, en encodant en uft-8 toutes les colonnes de chaîne qui ont généré cette erreur avant l'insertion. Par exemple, la colonne qui a généré l'erreur était nom_colonne , j'ai codé comme suit. Aussi, j'ai trouvé une autre colonne avec la même erreur, j'ai aussi utilisé cette solution.

$data [
//key=>values 
];

$myModel = new MyModel(); 

$data['column-name'] = DB::connection()->getPdo()->quote(utf8_encode($data['column-name']));

$myModel->insert($data); 
8
omixam

J'ai rencontré des problèmes similaires avec Laravel 5.5 et MariaDB 10.2. Lors du stockage de certaines entrées utilisateur t dans une colonne varchar, une exception:

SQLSTATE [22007]: Format de date/heure non valide: 1366 Valeur de chaîne incorrecte: '\ xE2\x80\x86y\xE2\x80 ...' pour la colonne 'commentaire' à la ligne 1

sera jeté.

Etant donné que cela ne s'est produit que sur le serveur de scène mais pas sur le serveur de développement local, j'ai comparé le classement et le jeu de caractères de la table de soulignement.

Le problème a été résolu en modifiant le classement de la base de données et des tables et le jeu de caractères en utf8mb64 et utf864mb_unicode_ci.

ALTER DATABASE <db_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Si vous rencontrez ce problème, veuillez vérifier le classement et le jeu de caractères de votre base de données et de votre table. Les chances sont Laravel que l'application encode avec utf8 alors que les bases de données utilisent autre chose.

2
Zhiyong Li

BD est le codage latin1 (et plusieurs autres) pour ½ (un demi). Le message d'erreur parle de le stocker dans un datetime. Donc, il semble y avoir au moins deux erreurs -

  • incompatibilité de CHARACTER SETs
  • requête mal formulée

Vous nous montrez quelque chose sur le CREATE TABLE, mais pourquoi "pouces" serait impliqué dans cela?

1
Rick James