Laravel:字符串数据,右截断:1406 数据对于列来说太长

2022-08-30 14:16:08

我有一个带有“酒店”列的表格。该项目是在Laravel 5.4中创建的,所以我使用了迁移。

$table->string('hotel', 50);

这是MYSQL VARCHAR(50)。它运作良好,因为当我开发时,我使用了简短的酒店名称,如“希尔顿纽约5号”*。

现在该项目正在生产中,客户问他们为什么不能输入长酒店名称。我用这样的模拟酒店名称测试过它,如“长长长长长长长和非常非常长的酒店名称5星”

它给了我一个错误:

“SQLSTATE[22001]:字符串数据,右截断:1406 数据对于第 1 行的'酒店'列来说太长了”

我已经在我的Sequel Pro中打开了数据库并更改了它

  • 首至瓦尔查尔 (255)
  • 然后到文本

每次更改后,我都使用相同的“长长长长长长长和非常非常长的酒店名称5开始”进行测试,并得到相同的错误(见上文)。

我已检查了列的类型

SHOW FIELDS FROM table_name

它给了我

现场|类型

酒店 |发短信

因此,该字段的类型确实是“文本”(65 535个字符)。

也许它与Laravel迁移文件(见上文)有某种联系,我在一开始就设置了VARCHAR(50)?但是我无法在生产环境中重新运行迁移,因为该表现在有数据。

将不胜感激任何帮助。


更新:我发现它实际上在DB中保存了很长的酒店名称。但是用户每次提交表单后仍然会遇到这个令人讨厌的错误...


答案 1

您需要创建一个新的迁移,使用命令注册它,然后运行命令来更改列的类型:composer duphp artisan migrate

Schema::table('the_table_name', function (Blueprint $table) {
    $table->string('hotel', 255)->change();
});

答案 2

在本地开发中,尝试将列类型更改为:

$table->longText('columnName')

从迁移文件中。这为我解决了这个问题。但是,如果您已经上线,则按照 Alexey 的建议创建新的迁移,然后使用列类型。longText()


推荐