日期时间格式无效:1366 字符串值不正确

2022-08-30 17:42:58

我收到此错误:

SQLSTATE[22007]: 无效的日期时间格式: 1366 不正确的字符串值: “\xBD 英寸...”对于第 1 行的“列名”

我的数据库、表和列的格式utf8mb4_unicode_ci列名也是文本类型和 NULL

这是列名的值

[列名] => 11 ▒ 之前的一些文本以及之后和之后的其他文本。

但是,我等待laravel将引号添加到列的值中,因为这些值由逗号(,)分隔。它应该如下:

[列名] => “11 ▒ 之前的一些文本以及之后和之后的其他文本。

请参阅下面的架构

    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。


答案 1

我解决了这个问题,在插入之前将所有生成此错误的字符串列编码为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); 

答案 2

我在Laravel 5.5和MariaDB 10.2上遇到了类似的问题。将某些用户输入 t 存储到 varchar 列中时,会出现异常:

SQLSTATE[22007]: 日期时间格式无效: 1366 字符串值不正确: “\xE2\x80\x86y\xE2\x80...””对于第 1 行的“注释”列

将被抛出。

由于这只发生在舞台服务器上,而不是在本地开发服务器上,我比较了下划线表的排序规则和字符集,结果发现数据库和舞台服务器上的表使用latin1,而本地开发服务器使用utf8mb4。

通过将数据库和表排序规则以及字符设置为 utf8mb4 并utf8mb4_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进行编码,而数据库使用其他内容。


推荐