昨日分の記事を投稿し忘れていました。こんばんは。今日はテックキャンプ現役受講生のアプリ開発Day4です。トップページのレイアウト作成とdevise導入をしていました。そこで遭遇したエラーについて概要と解決方法について紹介します。
Caused by:Mysql2::Error: Specified key was too long; max key length is 767 bytes
railsでdeviseのマイグレートファイルをマイグレートしようとしたときに出てきたエラーです。エラー内容を要約すると、「mysql2では767バイトのデータしか登録できないのに、deviseで作ろうとしたキー(カラムのこと?)は許容量をオーバーしてます。」というものです。一応エラーが出てきた経緯を記述した上で、解決方法を最後に記入しています。
エラーが出るまでの経緯
①まずはアプリケーションとDBを準備します。
rails _6.0.0_ new sample -d mysql
rails db:create
②次にdevise導入のために、Gemfileに以下を記述します
gem 'devise'
③Gemを他のGemと整合性を合わせてインストールします
bundle install
④deviseをインストールし、マイグレーションファイルを作成します。
rails g devise:install
⑤ユーザー登録機能を作成するためのdeviseを生成します
rails g devise user
⑥以下の写真のように、今回はnicknameカラムを追加します(今回のエラーとはあまり関係ないかも)。
⑦最後にマイグレートします。
rails db:migrate
⑧エラー発生!
エラー発生の原因
mysqlにデータを登録する際の文字コードが原因になります。railsではデフォルトでの文字コードがutf8mb4となっています。この文字コードのデータ量が、mysqlで受け取れるデータ量を超えてしまうために今回のエラーが発生します。従って、今回はdatebaseに登録される文字コードをよりデータ量の少ない「utf8」に変更して、エラーを解決します。
解決方法
①config/database.ymlの「encoding: utf8mb4」の部分を「encoding: utf8」と変更します。
②DBをリセットします(※)。
rails db:migrate:reset
③エラー解決です。
※②でrails db:migrateすると、「Mysql2::Error: Table 'users' already exists」とエラーが出るかもしれません。これはタイトルのエラーが出ながらも、テーブルが既に作成されているためです。手っ取り早く「rails db:migrate:reset」を利用しましたが、データを消したくない場合は別の手順を踏んでください。
参考サイト