1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】【MySQL】Mysql2::Error: Specified key was too long; max key length is 767 bytes

Posted at

昨日分の記事を投稿し忘れていました。こんばんは。今日はテックキャンプ現役受講生のアプリ開発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に以下を記述します

Gemfile
gem 'devise'

③Gemを他のGemと整合性を合わせてインストールします

ターミナル
bundle install

④deviseをインストールし、マイグレーションファイルを作成します。

ターミナル
rails g devise:install

⑤ユーザー登録機能を作成するためのdeviseを生成します

ターミナル
rails g devise user    

⑥以下の写真のように、今回はnicknameカラムを追加します(今回のエラーとはあまり関係ないかも)。
スクリーンショット 2022-06-19 21.56.56.png
⑦最後にマイグレートします。

ターミナル
rails db:migrate

⑧エラー発生!

エラー発生の原因

mysqlにデータを登録する際の文字コードが原因になります。railsではデフォルトでの文字コードがutf8mb4となっています。この文字コードのデータ量が、mysqlで受け取れるデータ量を超えてしまうために今回のエラーが発生します。従って、今回はdatebaseに登録される文字コードをよりデータ量の少ない「utf8」に変更して、エラーを解決します。

解決方法

①config/database.ymlの「encoding: utf8mb4」の部分を「encoding: utf8」と変更します。
スクリーンショット 2022-06-19 22.38.37.png
②DBをリセットします(※)。

ターミナル
rails db:migrate:reset 

③エラー解決です。

※②でrails db:migrateすると、「Mysql2::Error: Table 'users' already exists」とエラーが出るかもしれません。これはタイトルのエラーが出ながらも、テーブルが既に作成されているためです。手っ取り早く「rails db:migrate:reset」を利用しましたが、データを消したくない場合は別の手順を踏んでください。

参考サイト

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?