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

问题描述 投票:0回答:7

我收到此错误:

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

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

这是列名的值

[列名称] => 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。

php mysql laravel mariadb laravel-5.5
7个回答
22
投票

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

21
投票

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

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

会被扔掉。

由于这只发生在stage服务器上,而没有发生在本地开发服务器上,所以我比较了下划线表的排序规则和字符集,结果发现stage服务器上的数据库和表使用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 进行编码,而数据库则使用其他编码。


6
投票

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

例如 您必须使用

substr
 而不是 
mb_substr

此处的文档参考:多字节字符串函数

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


3
投票

按照以下步骤解决问题

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

2
投票

只需更改数据库配置(字符集和排序规则) in

配置/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(和其他几个)编码。 错误消息谈到将其存储在日期时间中。 所以,听起来至少有两个错误——

  • CHARACTER SETs
  • 不匹配
  • 查询格式不正确

你向我们展示了一些关于

CREATE TABLE
的东西,但是为什么“英寸”会参与其中?


0
投票

更改字符集:

更改表 table_name 转换为字符集 utf8mb4 整理 utf8mb4_unicode_ci

© www.soinside.com 2019 - 2024. All rights reserved.