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

Ser*_*min 12 php mysql text types laravel

我有一张带有'酒店'栏的桌子.该项目是在Laravel 5.4中创建的,因此我使用了迁移.

    $table->string('hotel', 50);
Run Code Online (Sandbox Code Playgroud)

这是MYSQL VARCHAR(50).它工作得很好,因为在我开发时,我使用的短名称如"HILTON NEW YORK 5 "*.

现在该项目正在进行生产,客户询问他们为什么不能输入长酒店名称.我用这样一个模拟的酒店名称测试了它"长长很长很长很长很长很长的酒店名称5星"

它给了我一个错误:

"SQLSTATE [22001]:字符串数据,右截断:1406对于第1行的列'hotel',数据太长"

我在Sequel Pro中打开了数据库并进行了更改

  • 首先到VARCHAR(255)
  • 然后到TEXT

在每次更改之后,我使用相同的"长长多长多长多长很长且非常非常长的酒店名称5开始"进行测试并得到相同的错误(见上文).

我已经检查了列的类型

SHOW FIELDS FROM table_name
Run Code Online (Sandbox Code Playgroud)

它给了我

领域| 类型

酒店| 文本

所以字段的类型确实是"文本"(65 535个字符).

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

非常感谢任何帮助.


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

JDK*_*Ben 13

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

$table->longText('columnName')
Run Code Online (Sandbox Code Playgroud)

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

  • longText() 比 text() 保存更多数据。所以,他知道他将处理非常大的文本,longText() 可以完成这项工作。 (2认同)

Ale*_*nin 10

您需要创建一个新的迁移,使用composer ducommand和run php artisan migrate命令注册它以更改列的类型:

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


小智 7

我将图片作为 base64 存储在文本列上,因此出现 SQL 错误:

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'picture' at row 1 
Run Code Online (Sandbox Code Playgroud)

我的迁移是

$table->text('picture')
Run Code Online (Sandbox Code Playgroud)

然后我将列图片更改为:

$table->mediumText('picture')
Run Code Online (Sandbox Code Playgroud)

我发现文本列只能存储 64 KB

文本:65,535 个字符 - 64 KB 中文本:16,777,215 - 16 MB 长文本:4,294,967,295 个字符 - 4 GB

欲了解更多信息,请访问:understanding-strorage-sizes-for-mysql-text-data-types