Php 无效的日期时间格式:1366不正确的字符串值
我得到了这个错误: SQLSTATE[22007]:无效的日期时间格式:1366不正确的字符串值:“\xBD Inch…”用于第1行的列“column name” 我的数据库、表和列的格式为utf8mb4\u unicode\u ci,列名为text和NULL 这是列名的值 [列名]=>11之前的一些文本▒ 和其他文本之后,和之后 但是,我等待laravel在列的值中添加引号,因为值之间用逗号(,)分隔。具体内容如下: [列名]=>“11之前的一些文本▒ 以及后面和后面的其他文本。” 请参见下面的模式Php 无效的日期时间格式:1366不正确的字符串值,php,mysql,laravel,mariadb,laravel-5.5,Php,Mysql,Laravel,Mariadb,Laravel 5.5,我得到了这个错误: SQLSTATE[22007]:无效的日期时间格式:1366不正确的字符串值:“\xBD Inch…”用于第1行的列“column name” 我的数据库、表和列的格式为utf8mb4\u unicode\u ci,列名为text和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。
BD
是½(一半)的拉丁1(和其他几种)编码。错误消息谈到将其存储在datetime中。所以,听起来至少有两个错误--
字符集不匹配
- 格式错误的查询
您向我们展示了一些关于创建表的内容,但是为什么会涉及“inches”呢?我解决了这个问题,在插入之前将生成此错误的所有字符串列编码到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);
我在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;
ALTER数据库字符集utf8mb4校对utf8mb4\u unicode\u ci;
ALTER TABLE转换为字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci;
对于遇到此问题的任何人,请检查数据库和表的排序规则和字符集。Laravel应用程序很可能是用utf8编码的,而数据库使用了其他功能。如果您没有解决此问题,请检查您是否仅在其多字节变体中使用了字符串函数
e、 g。
您必须使用mb\u substr
此处的文档参考:
为将来可能会遇到我同样问题的读者编写:)只需在中更改数据库配置(字符集和排序规则)
config/database.php
致:
按照以下步骤解决问题
1-更改字符并整理表格
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
'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,
],
php artisan config:cache
2-更改config/database.php文件
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
'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,
],
php artisan config:cache
3-运行此命令以重新生成配置缓存
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
'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,
],
php artisan config:cache
可能的答案:看起来该列应该是日期时间格式,而不是字符串。检查您的模式。问题看起来像其他问题,Laravel没有用引号括起来。我的字符串中有逗号。insert错误用反勾号显示列的名称,但列的值没有引号。Laravel使用参数绑定,该绑定不引用值。显示您的数据库架构和您正在使用的确切代码。我正在使用我的模型实例插入$myModel=new myModel()$myModel->insert($data);当您谈到模式时,您是指迁移吗?问题实际上与缺少引号有关,我接受原始查询,为每个值添加引号,并直接在数据库中运行,并正确插入。现在,它转向另一个问题:为什么拉雷维尔缺少引号,以及如何解决它?拉雷维尔不是缺少引号。它使用PDO、预处理语句和参数绑定,绕过了引号的需要。让我们看看生成的SQL。只需添加utf8_encode()方法就可以了。引用所有内容可以用引号保存我的价值观