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

Posted

技术标签:

【中文标题】日期时间格式无效:1366 字符串值不正确【英文标题】:Invalid datetime format: 1366 Incorrect string value 【发布时间】:2018-06-24 12:28:35 【问题描述】:

我收到此错误:

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

我的数据库、表和列的格式为 utf8mb4_unicode_ci,列名的类型为 textNULL

这是列名的值

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

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

[column-name] => '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。

【问题讨论】:

可能的答案:***.com/questions/11553124/… 看起来该列应该是日期时间格式,而不是字符串。检查您的架构。 问题看起来像其他的,Laravel 没有用引号括起来。我的字符串中有逗号。插入错误用反引号显示列的名称,但列的值没有引号。 Laravel 使用参数绑定,它不引用值。显示您的数据库架构和您正在使用的确切代码。 我正在使用我的模型实例插入 $myModel = new MyModel(); $myModel->插入($data);当您谈论架构时,您指的是迁移吗? 【参考方案1】:

BD½(二分之一)的latin1(和其他几个)编码。错误消息谈到将其存储在日期时间中。所以,听起来至少有两个错误--

CHARACTER SETs 不匹配 查询表述不当

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

【讨论】:

问题确实与缺少引号有关,我采用原始查询,为每个值添加引号并直接在数据库中运行,并正确插入。现在转向另一个问题:为什么 Laravel 缺少引号以及如何解决? Laravel 不缺少引号。它使用 PDO、准备好的语句和参数绑定,从而绕过了对引号的需求。 让我们看看生成的SQL【参考方案2】:

我解决了它,在插入之前将所有生成此错误的字符串列编码为 uft-8。例如,产生错误的列是 column-name,我编码如下所示。另外我发现其他列有相同的错误,我也使用了这个解决方案。

$data [
//key=>values 
];

$myModel = new MyModel(); 

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

$myModel->insert($data); 

【讨论】:

只需添加 utf8_encode() 方法就可以了。引用一切字面意思用引号保存了我的价值观【参考方案3】:

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

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

将被抛出。

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

通过将数据库和表排序规则和字符集更改为 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 编码,而数据库使用其他东西。

【讨论】:

【参考方案4】:

如果mb-convert-encoding 或utf8-encode 没有为您解决此问题,请检查您是否仅在其多字节变体中使用字符串函数

例如 您必须使用 mb_substr 而不是 substr

此处的文档参考:Multibyte String Functions

写给未来可能遇到我同样问题的读者:)

【讨论】:

【参考方案5】:

只需更改数据库配置(charset & collat​​ion) in

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**
        ],
]

【讨论】:

【参考方案6】:

按照此步骤解决问题

1- 更改 CHARACTER 和 COLLATE 的表

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

【讨论】:

以上是关于日期时间格式无效:1366 字符串值不正确的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE[22007]:无效的日期时间格式:1366 字符串值不正确,html_entity_decode 函数

日期时间格式无效:1292 日期时间值不正确 [重复]

在 Laravel 迁移中更改日期格式

正确确定日期字符串是不是是该格式的有效日期

#1411 - INSERT INTO...SELECT 上函数 str_to_date 的日期时间值不正确

日期时间值不正确 数据库错误号:1292