「ホテル」列のあるテーブルがあります。プロジェクトは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でデータベースを開いて変更しました
変更するたびに、同じ「Long long long long long long long long longと非常に非常に長いホテル名5の開始」でテストし、同じエラーを取得します(上記を参照)。
列のタイプを確認しました
SHOW FIELDS FROM table_name
そしてそれは私に与えた
フィールド|タイプ
ホテル|テキスト
したがって、フィールドのタイプは実際には「テキスト」です(65 535文字)。
たぶん、Laravel移行ファイル(上記を参照)に接続されている場所に接続されているのでしょうか?しかし、テーブルにデータがあるため、実稼働環境で移行を再実行できません。 。
助けていただければ幸いです。
PDATE: DBにその長いホテル名が実際に保存されることがわかりました。しかし、ユーザーはフォームを送信した後、毎回この迷惑な間違いを受け取ります...
新しい移行を作成し、composer du
コマンドで登録し、php artisan migrate
コマンドを実行して列のタイプを変更する必要があります。
Schema::table('the_table_name', function (Blueprint $table) {
$table->string('hotel', 255)->change();
});
ローカル開発で、列タイプを次のように変更してみてください。
_$table->longText('columnName')
_
移行ファイルから。それで解決しました。ただし、ライブに移行した場合は、Alexeyが提案したとおりに新しい移行を作成し、longText()
列タイプを使用します。
列のタイプをstring
からtext
に変更します。
次に、php artisan migrate:refesh
を使用して移行更新を実行します
列のデータ型を文字列からテキストに変更し、長さを指定しないでください。