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】Mysql2::Error: Specified key was too long; max key length is 767 bytes エラーを解決する方法

Posted at

はじめに

こんにちは、だいごです。
今回はタイトルのエラーを解決する方法をまとめていきます。
よかったらご覧ください。

エラーについて

まず、今回発生したエラーはターミナルにてrails db:migrateを実行した際に発生しました。
エラー文は以下に記します。

ターミナル
ユーザー名@コンピュータ名 カレントディレクトリ % rails db:migrate

# エラー文
== 20220413235353 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.1096s
-- add_index(:users, :email, {:unique=>true})
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Specified key was too long; max key length is 767 bytes
/Users/○○/○○/○○/db/migrate/20220413235353_devise_create_users.rb:45:in `change'
/Users/○○/○○/○○/bin/rails:9:in `<top (required)>'
/Users/○○/○○/○○/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

# 省略

このエラーは「Mysql2に、格納できる文字データは、767バイトまでで、このままでは、Mysqlにマイグレーションできない」という意味になります。

エラーが発生した原因

このエラーが発生した原因はdatabase.ymlにあります。

datebase.yml
# 省略

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

# 省略

注目すべきなのはencoding: utf8mb4の部分です。
ここでは、文字コードを指定しているのですが、今のutf8mb4では1文字4バイトとなります。
MySQLではstring型を指定した場合、デフォルトで255文字となるため、
255×4=1020(バイト)となり、767バイトを超えてしまうので、エラーが発生してしまったということです。

エラー解決の流れ

ここからは実際にエラーを解決していきます。
エラーの解決方法としては、文字コードを変えて767バイトを超えないようにする方法を使用します。

まずは、datebase.ymlの記述を変更します。

database.yml
# 省略

default: &default
  adapter: mysql2
  encoding: utf8  #utf8に変更
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

# 省略

ここでは、encoding: utf8に変更しています。
utf8では1文字3バイトとなり、255×3=765(バイト)で、
767バイトの範囲内で収めることができています。
これでエラーの原因を排除することができました。

次に、DBを作り直していきます。
まず、マイグレーションファイルの状態を確認します。

ターミナル
ユーザー名@コンピュータ名 カレントディレクトリ % rails db:migrate:status

# 出力結果
database: ○○_development

 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20220413235353  Devise create users

マイグレーションファイルがdownになっていることが確認できたら、
rails db:resetコマンドを実行していきます。
これは、DBを一度削除し、再度生成するコマンドです。

ターミナル
ユーザー名@コンピュータ名 カレントディレクトリ % rails db:reset

# 出力結果
Dropped database '○○_development'
Dropped database '○○_test'
Created database '○○_development'
Created database '○○_test'
/Users/○○/○○/○○/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /Users/○○/○○/○○/config/application.rb to limit the frameworks that will be loaded.

この後、再びrails db:migrateを実行します。

ターミナル
ユーザー名@コンピュータ名 カレントディレクトリ % rails db:migrate

# 出力結果
== 20220413235353 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0209s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0514s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0193s
== 20220413235353 DeviseCreateUsers: migrated (0.0975s) =======================

以上で、エラーの解消は完了です。

終わりに

今回はエラーの解決方法についてまとめました。
他にも解決方法があるみたいなので、またエラーが出た時にやってみようと思います。
ご指摘・コメントお待ちしております。
ありがとうございました。

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?