web-dev-qa-db-ja.com

無効な日時形式:1366不正な文字列値

私はこのエラーを受け取っています:

SQLSTATE [22007]:無効な日時形式:1366不正な文字列値:行1の列 'column-name'の '\ xBD Inch ...'

データベース、テーブル、および列の形式はtf8mb4_unicode_ciであり、column-nameもtypetextおよび[〜#〜] null [〜#〜]

これは列名の値です

[column-name] => 11 beforeの前のテキストと、その後のテキスト。

ただし、値がコンマ(、)で区切られているため、laravelは列の値に引用符を追加します。次のようになります。

[列名] => '11 beforeの前のテキストとその他のテキストの前後。

以下のスキーマを参照してください

    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');
    });

私はグーグルで探していましたが、解決策はまだありませんでした。

誰もこの問題を解決する方法を知っていますか?

Laravel 5.5およびMariaDB 10.2.11。を使用しています。

9
omixam

挿入前にこのエラーを生成したすべての文字列列をuft-8にエンコードして解決しました。たとえば、エラーを生成した列は列名で、show bellowとしてエンコードしました。また、同じエラーのある他の列を見つけました。このソリューションも使用しました。

$data [
//key=>values 
];

$myModel = new MyModel(); 

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

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

Laravel 5.5とMariaDB 10.2で同様の問題に遭遇しました。ユーザー入力tをvarchar列に格納するとき、例外があります。

SQLSTATE [22007]:無効な日時形式:1366不正な文字列値:行1の列 'comment'の '\ xE2\x80\x86y\xE2\x80 ...'

スローされます。

これはステージサーバーでのみ発生し、ローカルdevサーバーでは発生しなかったため、下線テーブルの照合と文字セットを比較しました。

この問題は、データベースとテーブルの照合順序および文字セットをutf8mb64および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;

この問題が発生した場合は、データベースとテーブルの照合と文字セットを確認してください。可能性はLaravelアプリはutf8でエンコードしていますが、データベースは他のものを使用しています。

6
Zhiyong Li

BDは、½(半分)のlatin1(および他のいくつかの)エンコードです。エラーメッセージは、それを日時に保存することについて説明しています。したがって、少なくとも2つのエラーがあるように思えます-

  • CHARACTER SETsの不一致
  • 不十分な形式のクエリ

CREATE TABLEについて何かお見せしますが、なぜ「インチ」がそれに関与するのでしょうか?

1
Rick James