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

25

我遇到了这个错误:

SQLSTATE[22007]:无效的日期时间格式:在第1行的“column-name”列中,字符串值“\xBD Inch ...”不正确。

我的数据库、表和列的格式为utf8mb4_unicode_ci,column-name的类型是textNULL

这是column-name的值:

[column-name] => 在11 ▒之前有一些文本和其他文本,在之后还有。

然而我希望Laravel给列添加引号,因为这些值是由逗号(,)分隔的。它应该如下所示:

[column-name] => 'Some text before 11 ▒ and other text after, and after.'

请参阅下面的模式

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

我已经在Google上搜索了很久,但没有任何解决方案。

有人有什么想法来解决这个问题吗?

我正在使用Laravel 5.5和MariaDB 10.2.11。


1
看起来这一列应该是日期时间格式,而不是字符串。请检查您的模式。 - aynber
问题看起来和其他的一样,Laravel没有用引号括起来。我的字符串中有逗号。插入错误显示列名带有反引号,但是列的值没有引号。 - gvd
我正在使用我的模型实例来插入 $myModel = new MyModel(); $myModel->insert($data); 当你谈论模式时,你是指迁移吗? - gvd
可以的。请确保您在问题编辑中附上代码,而不是将其放在评论中。 - aynber
我将表的模式添加到问题中。 - gvd
显示剩余2条评论
6个回答

21

我解决了这个问题,将所有生成此错误的字符串列编码为UTF-8,然后再插入。例如,生成错误的列是列名,我按照以下方式进行了编码。同时,我还发现另一个出现相同错误的列,我也使用了这个解决方案。

$data [
//key=>values 
];

$myModel = new MyModel(); 

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

$myModel->insert($data); 

3
仅仅加上utf8_encode()方法就解决了我的问题。将所有内容以字面形式引用(加上引号)保留了我的值。 - danielkelly_io

20
我在使用Laravel 5.5和MariaDB 10.2时遇到了类似的问题。将一些用户输入存储到varchar列中时,将抛出异常:

SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xE2\x80\x86y\xE2\x80...' for column 'comment' at row 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 进行编码,而数据库使用其他字符集。


5
如果 mb-convert-encoding 或者 utf8-encode 不能解决你的问题,那么请检查一下是否只使用了多字节变体的字符串函数。
例如: 使用 mb_substr 代替 substr 可以参考文档:多字节字符串函数 本内容是为未来可能遇到相同问题的读者编写的 :)

2

按照以下步骤解决问题

1- 更改字符和排序表格

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

2-修改配置文件 /database.php

 'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',//****make sure these configs are set
        'collation' => 'utf8mb4_unicode_ci',//****make sure these configs are set
        'prefix' => '',
        'strict' => true,
        'engine' => null,
     
    ],

3- 运行此命令以重新生成配置缓存

php artisan config:cache

2

只需更改数据库配置(字符集和校对规则)

config/database.php

到:

'connections' => [
        'mydb' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST'),
            'database' => env('DB_DATABASE'),
            'username' => env('DB_USERNAME'),
            'password' => env('DB_PASSWORD'),
            'charset'   => 'utf8mb4',              // **for emoticons**
            'collation' => 'utf8mb4_unicode_ci',   // **for emoticons**
        ],
]

1

BD是latin1(以及其他几种)编码的½(一半)。错误消息谈论将其存储在datetime中。因此,似乎至少有两个错误--

  • 字符集不匹配
  • 查询公式不良

您向我们展示了关于CREATE TABLE的一些内容,但为什么会涉及“英寸”?


问题实际上与缺少引号有关,我将原始查询取出,为每个值添加引号并直接在数据库中运行,成功插入。现在问题变成了另一个:为什么Laravel缺少引号,如何解决? - gvd
Laravel 没有缺少引号。它使用 PDO、预处理语句和参数绑定,从而避免了需要引号的情况。 - aynber
让我们看看生成的 SQL。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接