質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Q&A

解決済

4回答

2027閲覧

SQLSTATE[22001]エラーの解消

moana

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

0グッド

0クリップ

投稿2023/09/26 05:25

編集2023/09/26 11:57

実現したいこと

新規登録時のエラーを解消したい

前提

Laravel8でSNSサイトを作っています。
新規登録時に下記のエラーが発生しました。
取得したデータ長がカラムの長さと一致しないためエラーが発生しているかと思いますが、
設計書通りに入力したはずなのにエラーが出ている理由がわかりません。
長さの認識が間違っているかもしれないので、説明いただけると助かります。

発生している問題・エラーメッセージ

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'password' at row 1 (SQL: insert into `users` (`name`, `email`, `password`, `updated_at`, `created_at`) values (test1, test1@test, $2y$10$37kkBJzrzcEAwN4TVpkZWe8A4Z7bAgFaHuQVo7.loTdpe6hyjwyge, 2023-09-26 14:00:15, 2023-09-26 14:00:15))

該当のソースコード

2014_10_12_000000_create_users_table.php

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6use Illuminate\Support\Facades\DB; 7 8class CreateUsersTable extends Migration 9{ 10 /** 11 * Run the migrations. 12 * 13 * @return void 14 */ 15 public function up() 16 { 17 Schema::create('users', function (Blueprint $table) { 18 $table->increments('id'); 19 $table->string('name',12); 20 $table->string('email',12)->unique(); 21 $table->string('password',12)->unique(); 22 $table->timestamps(); 23 }); 24 } 25 26 /** 27 * Reverse the migrations. 28 * 29 * @return void 30 */ 31 public function down() 32 { 33 Schema::dropIfExists('users'); 34 } 35}

2023_09_26_204941_modify_users_table.php

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class ModifyUsersTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::table('users', function (Blueprint $table) { 17 $table->string('password')->nullable()->change(); 18 }); 19 } 20 21 /** 22 * Reverse the migrations. 23 * 24 * @return void 25 */ 26 public function down() 27 { 28 Schema::table('users', function (Blueprint $table) { 29 // 30 }); 31 } 32}

試したこと

データ長については調べて理解しましたが、設計書通りにマイグレーションファイルを設定しているのにエラーが出ている理由がわかりません。

補足情報(FW/ツールのバージョンなど)

ER図
email
種類:テキストボックス
必須:○
長さ:12
データ型:文字列
password
種類:テキストボックス
必須:○
長さ:12
データ型:文字列
name
種類:テキストボックス
必須:○
長さ:12
データ型:文字列
パスワードはtest1234で試しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

エラーメッセージから、パスワードの長さが12文字を超えているためにエラーが発生していることがわかります。

マイグレーションファイルでは、パスワードのカラムの長さを12文字に設定しています。しかし、実際に入力したパスワードは「test1234」で、これは12文字を超えています。そのため、データベースに保存する際に、パスワードの右側が切り捨てられてエラーが発生します。

解決策としては、パスワードの長さを12文字以下にするか、あるいはパスワードのバリデーションルールを変更して、12文字を超えるパスワードを入力できないようにする方法があります。

パスワードの長さを12文字以下にする場合、マイグレーションファイルを修正する必要があります。

// 2023_09_26_204941_modify_users_table.php class ModifyUsersTable extends Migration { public function up() { Schema::table('users', function (Blueprint $table) { $table->string('password', 12)->nullable()->change(); }); } // ... }

パスワードのバリデーションルールを変更する場合、コントローラーやリクエストクラスでバリデーションを追加します。

php

1// App\Http\Controllers\Auth\RegisterController.php 2 3class RegisterController extends Controller 4{ 5 public function register(Request $request) 6 { 7 $request->validate([ 8 'name' => 'required|string|max:12', 9 'email' => 'required|email|unique:users', 10 'password' => 'required|string|min:6|max:12', 11 ]); 12 13 // ... 14 } 15}

php

1// App\Http\Requests\RegisterRequest.php 2 3class RegisterRequest extends FormRequest 4{ 5 public function rules() 6 { 7 return [ 8 'name' => 'required|string|max:12', 9 'email' => 'required|email|unique:users', 10 'password' => 'required|string|min:6|max:12', 11 ]; 12 } 13}

この場合、パスワードのバリデーションルールを「max:12」に変更します。これにより、12文字を超えるパスワードを入力できなくなります。
●●●●

投稿2024/02/01 02:06

lunadam

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

$table->string('password',12)->unique();

上記マイグレーションのpassword定義を
$table->string('password')->nullable();に変更してください。

パスワード列はハッシュ化したものが入るので最大12文字としてしまうと足りなくなるので指定なしでよいです。

> Hash::make('test1234') = "$2y$10$PM0Sec2I06vqgqE4xO8nqeO5wro6A8ubmsUBuEoEbN21h42QmKZ82"

指定なしだとMySQLではvarchar(255)という型になりハッシュ化したパスワードもサイズのエラーなく格納できます。

投稿2023/09/26 10:47

niiyz

総合スコア131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moana

2023/09/26 11:54

ありがとうございます。 修正用ファイルを作ってphp artisan migrateをしてみたのですが、下記のエラーが出てしまいました。 RuntimeException Changing columns for table "users" requires Doctrine DBAL. Please install the doctrine/dbal package. at vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/ChangeColumn.php:30 26▕ */ 27▕ public static function compile($grammar, Blueprint $blueprint, Fluent $command, Connection $connection) 28▕ { 29▕ if (! $connection->isDoctrineAvailable()) { ➜ 30▕ throw new RuntimeException(sprintf( 31▕ 'Changing columns for table "%s" requires Doctrine DBAL. Please install the doctrine/dbal package.', 32▕ $blueprint->getTable() 33▕ )); 34▕ } +6 vendor frames 7 database/migrations/2023_09_26_204941_modify_users_table.php:16 Illuminate\Support\Facades\Facade::__callStatic("table") +22 vendor frames 30 artisan:35 修正用ファイルの内容は質問内容のソースコードに追記しております。 これはコードが間違っているということでしょうか?
niiyz

2023/09/26 13:46

カラム変更の処理にパッケージが必要です。 以下でインストールしてください。 composer require doctrine/dbal エラーメッセージでググれば英語でも日本語でもかなりヒットする情報です。
guest

0

クエリビルダーでプレースホルダー処理をしているということですよね?
基本的にはpasswordカラムに十分な長さのvarcharかtextをしてい指定することです

投稿2023/09/26 07:30

編集2023/09/27 02:51
yambejp

総合スコア117644

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moana

2023/09/26 09:32

後半の文に誤字がありどういう意味かわかりません。
guest

0

SQLでは文字列はシングルクォートで囲む(シングルクォーティング)のがオキテ。
test1, test1@test, $2y$10$37kkBJzrzcEAwN4TVpkZWe8A4Z7bAgFaHuQVo7.loTdpe6hyjwyge, 2023-09-26 14:00:15, 2023-09-26 14:00:15

'test1', 'test1@test', '$2y$10$37kkBJzrzcEAwN4TVpkZWe8A4Z7bAgFaHuQVo7.loTdpe6hyjwyge', '2023-09-26 14:00:15', '2023-09-26 14:00:15'

投稿2023/09/26 07:09

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moana

2023/09/26 09:32

エラー文に書いてあるのは実際にローカル環境で作成したサイトで新規登録しようとした際に入れた値です。(test1が名前、test1@testがメールアドレス、暗号化されているのがパスワード) なのでシングルクオーテーションで囲むのは違うと思います。カラム名は記載の通りシングルクオーテーションで囲まれていますし…
Orlofsky

2023/09/26 10:40

>SQLでは文字列はシングルクォートで囲む(シングルクォーティング)のがオキテ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問