web-dev-qa-db-ja.com

Laravel:文字列データ、右端が切り捨てられました:1406データが列に対して長すぎます

「ホテル」列のあるテーブルがあります。プロジェクトはLaravel 5.4で作成されるため、移行を使用しました。

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

これはMYSQL VARCHAR(50)です。私が開発していたとき、 "HILTON NEW YORK 5" *のような短いホテル名を使用していたので、うまくいきました。

現在、プロジェクトは生産中であり、顧客は長いホテル名を入力できない理由を尋ねました。 "Long long long long long long long long longと非常に非常に長いホテル名5つ星"のような模擬ホテル名でテストしました。 -)

エラーが発生しました:

"SQLSTATE [22001]:文字列データ、右端が切り捨てられました:1406行1の列 'hotel'のデータが長すぎます"

Sequel Proでデータベースを開いて変更しました

  • 最初にVARCHAR(255)
  • 次にTEXT

変更するたびに、同じ「Long long long long long long long long longと非常に非常に長いホテル名5の開始」でテストし、同じエラーを取得します(上記を参照)。

列のタイプを確認しました

SHOW FIELDS FROM table_name

そしてそれは私に与えた

フィールド|タイプ

ホテル|テキスト

したがって、フィールドのタイプは実際には「テキスト」です(65 535文字)。

たぶん、Laravel移行ファイル(上記を参照)に接続されている場所に接続されているのでしょうか?しかし、テーブルにデータがあるため、実稼働環境で移行を再実行できません。 。

助けていただければ幸いです。


PDATE: DBにその長いホテル名が実際に保存されることがわかりました。しかし、ユーザーはフォームを送信した後、毎回この迷惑な間違いを受け取ります...

11
Sergej Fomin

新しい移行を作成し、composer duコマンドで登録し、php artisan migrateコマンドを実行して列のタイプを変更する必要があります。

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

ローカル開発で、列タイプを次のように変更してみてください。

_$table->longText('columnName')
_

移行ファイルから。それで解決しました。ただし、ライブに移行した場合は、Alexeyが提案したとおりに新しい移行を作成し、longText()列タイプを使用します。

4
JDK Ben

列のタイプをstringからtextに変更します。

次に、php artisan migrate:refeshを使用して移行更新を実行します

1

列のデータ型を文字列からテキストに変更し、長さを指定しないでください。

0