我有一张带有'hotel'列的桌子。该项目是在Laravel 5.4中创建的,因此我使用了迁移。
$table->string('hotel', 50);
这是MYSQL VARCHAR(50)。它运作良好,因为当我开发时,我使用了短名称,如“HILTON NEW YORK 5 ”*。
现在该项目已投入生产,客户询问为何他们无法输入长酒店名称。我用这样一个模拟的酒店名称进行了测试,因为“很长很长很长很长很长很长很长的酒店名称5星”
它给了我一个错误:
“SQLSTATE [22001]:字符串数据,右截断:1406数据太长了 第1行的“酒店”栏目“
我在Sequel Pro中打开了数据库并对其进行了更改
每次更改后,我都会使用相同的“Long long long long long long long long long,非常非常非常长的酒店名称5 start”进行测试,并得到相同的错误(见上文)。
我用
检查了列的类型SHOW FIELDS FROM table_name
它给了我
字段|型
酒店|文本
因此字段的类型确实是“文本”(65 535个字符)。
也许它与Laravel Migration文件(见上文)有某种关联,我在开始时设置了VARCHAR(50)?但我无法在生产中重新运行迁移,因为该表现在有数据。
感谢任何帮助。
更新 我发现它实际上在DB中保存了那么长的酒店名称。但是每次提交表单后,用户仍然会收到这个恼人的错误......
答案 0 :(得分:9)
您需要创建一个新的迁移,使用composer du
命令注册它并运行php artisan migrate
命令来更改列的类型:
Schema::table('the_table_name', function (Blueprint $table) {
$table->string('hotel', 255)->change();
});
答案 1 :(得分:4)
在您的本地开发中,尝试将列类型更改为:
$table->longText('columnName')
来自您的迁移文件。那为我解决了。但是,如果您已经上线,则按照Alexey的建议创建一个新的迁移,然后使用longText()
列类型。
答案 2 :(得分:1)
将列的类型从string
更改为text
。
然后使用php artisan migrate:refesh
答案 3 :(得分:1)
此错误的解决方法
"SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'hotel' at row 1"
打开Mysql并点击该列的furent中的更改按钮并使长度/值= 111
答案 4 :(得分:0)
将列的数据类型从字符串更改为文本,并且不给出长度。
答案 5 :(得分:0)
将列的数据类型从字符串更改为文本,并且不给出长度。
$table->text('hotel')->change();
答案 6 :(得分:0)
我将图片存储为text64上的base64,所以出现了SQL错误:
SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'picture' at row 1
我以
的身份进行了迁移$table->text('picture')
然后我将列图片更改为:
$table->mediumText('picture')
我意识到text列只能存储64 KB
TEXT:65,535个字符-64 KB MEDIUMTEXT:16,777,215-16 MB 长文本:4,294,967,295个字符-4 GB
有关更多信息,请访问:understanding-strorage-sizes-for-mysql-text-data-types
答案 7 :(得分:0)
如果'text'数据类型不起作用
,将数据库中列的数据类型更改为'longtext'答案 8 :(得分:0)
public function up()
{
Schema::table('news', function (Blueprint $table) {
$table->text('content')->change();
});
}
public function down()
{
Schema::table('news', function (Blueprint $table) {
$table->string('content', 65536)->change();
});
}