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

时间:2018-01-15 20:40:28

标签: php mysql laravel mariadb laravel-5.5

我收到了这个错误:

  

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

我的数据库,表和列的格式为 utf8mb4_unicode_ci ,列名为 text NULL

这是列名

的值
  

[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。

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

  

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

将被抛出。

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

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

答案 2 :(得分:1)

BD½(一半)的latin1(和其他几个)编码。该错误消息涉及在日期时间中存储该错误消息。所以,听起来至少有两个错误 -

  • CHARACTER SETs
  • 不匹配
  • 制作不充分的查询

您向我们展示了CREATE TABLE的一些内容,但为什么“英寸”会参与其中?

答案 3 :(得分:1)

只需更改

中的数据库配置(字符集和排序规则)

config / database.php

收件人:

def bit_strings(size, one_count):
    for one_indices in itertools.combinations(range(size), one_count):
        yield ''.join('1' if i in one_indices else '0' for i in range(size))

>>> len(list(bit_strings(20, 10))) # takes a bit less than a second on my machine
184756

答案 4 :(得分:0)

如果mb-convert-encodingutf8-encode不能为您解决此问题,请检查您是否仅在多字节变体中使用 string函数

例如 您必须使用substr

来代替mb_substr

文档参考此处:Multibyte String Functions

是为将来可能遇到我同样问题的读者而写的:)

答案 5 :(得分:0)

按照此步骤解决问题

1- 更改 CHARACTER 和 COLLATE`s 表

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