Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel: String data, right truncated: 1406 Data too long for column

I have a table with a column 'hotel'. The project is created in Laravel 5.4, so I used Migrations.

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

This is MYSQL VARCHAR (50). It was working good, because when I was developing I used short hotel names like "HILTON NEW YORK 5"*.

Now the project is on production and customer asked why they can't input long hotel names. I've tested it with such a mock hotel name as "Long long long long long long long long long and very-very-very long hotel name 5 stars"

It gave me an error:

"SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'hotel' at row 1"

I've opened database in my Sequel Pro and changed it

  • first to VARCHAR (255)
  • then to TEXT

After each change I tested it with the same "Long long long long long long long long long and very-very-very long hotel name 5 starts" and get the same error (see above).

I've checked the type of column with

SHOW FIELDS FROM table_name

and it gave me

Field | Type

hotel | text

so the type of the field is 'text' indeed (65 535 characters).

Maybe it's somehow connected with Laravel Migration file (see above) where I set VARCHAR (50) in the beginning? But I can't re-run migration on production, because the table has data now.

Would appreciate any help.


UPDATE: I discovered that it actually saves that long hotel name in the DB. But user still gets this annoying mistake every time after submitting the form...

like image 618
Sergej Fomin Avatar asked Jan 27 '18 16:01

Sergej Fomin


4 Answers

You need to create a new migration, register it with composer du command and run php artisan migrate command to change type of the column:

Schema::table('the_table_name', function (Blueprint $table) {
    $table->string('hotel', 255)->change();
});
like image 126
Alexey Mezenin Avatar answered Oct 23 '22 03:10

Alexey Mezenin


On your local development, try changing the column type to:

$table->longText('columnName')

from your migration file. That solved it for me. But if you have gone live, then create a new migration just as Alexey has suggested and then use longText() column type.

like image 21
JDK Ben Avatar answered Oct 23 '22 05:10

JDK Ben


I was storing pictures as base64 on a text colum so I got a SQL error:

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'picture' at row 1 

I did my migration as

$table->text('picture')

then I changed de column picture as:

$table->mediumText('picture')

I realiced that text column allows to store only 64 KB

TEXT: 65,535 characters - 64 KB MEDIUMTEXT: 16,777,215 - 16 MB LONGTEXT: 4,294,967,295 characters - 4 GB

For more info visit: understanding-strorage-sizes-for-mysql-text-data-types

like image 5
Ing Oscar MR Avatar answered Oct 23 '22 05:10

Ing Oscar MR


Change column's datatype from string to text and do not give length.

like image 3
Abi Raj Nijanandi Avatar answered Oct 23 '22 05:10

Abi Raj Nijanandi