No. | タイトル |
---|---|
1 | マークダウンの備忘録 |
2 | 投稿記事一つ目 |
3 | 現在の記事 |
エラーが発生いたしました。
An error has occurred
マイグレーションファイルの実行をした時です。
rails db:migrate
:Error: Specified key was too long; max key length is 767 bytes
キーの長さが最大767バイトを超えてしまったとエラー文です。
直前の自身の操作を思い返してみます。
t.string :name, null: false
キーについてマイグレーションファイルに記述を行なっていました。
では、このキー(:name)が怪しいです。
名前の文字数に関連する何かであると考えられます。
エラー文を検索すると以下の記事に詳細が書かれていました。
https://qiita.com/terufumi1122/items/9ea764618eba01144e09
RailsやCakePHPのデフォルトで生成される255文字のVARCHARでは、3バイトのutf8では255×3=765でほぼぴったり収まります。一方、utf8mb4ではオーバーしてしまうので、エラーとなりました。
ここでVARCHARとは、データベースのフィールド定義などで用いられるデータ型の一つで、可変長の文字列を意味するデータ型のことです。
http://e-words.jp/w/VARCHAR.html#:~:text=VARCHAR%E3%81%A8%E3%81%AF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE,%E3%82%92%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%80%82
つまり推測になりますが、カラムの型と、そのキーを記述してマイグレーションファイルを実行するということは、
そのキー(テーブルにおけるカラム)について767バイト分のデータ容量を確保するといことになるのでしょうか。
可変長ということなので、レコードごとにその容量は異なりますが、767バイトは超えてはいけなく、かつnull: falseによって0バイトでもいけないということでしょう。
ここでもう一度、上記の引用です。
RailsやCakePHPのデフォルトで生成される255文字のVARCHARでは、3バイトのutf8では255×3=765でほぼぴったり収まります。一方、utf8mb4ではオーバーしてしまうので、エラーとなりました。
Railsにおいて、255文字分のVARCHARは自動生成され、
そして、一文字ごとのデータの大きさは文字コードによって異なるみたいです。
文字コードutf8は255文字生成されたとしてもそのデータの大きさは765バイト、可変長容量内です。
よって今回、文字コードの指定がutf8mb4となっていると考えられます。
アプリケーションの開発において、
文字コードの記述があるパスは、
config/database.ymlです。
行ってみると
encoding: utf8mb4
と記述がされていました。
ecoding: utf8
に記述を書き直し。
再度マイグレーションファイルの実行をします。
:Error: Table 'users' already exists
不安を覚えましたので
Sequel Proを確認しにいきます、
文字コードに関連しているだろう記述がある部分を見つけました。

utf8mb4のままの部分がございます。
データベースのリセットを一度行います。
rails db:reset
その上でマイグレーションファイルを実行いたします。
rails db:migrate
今回はエラー文が表示されませんでした。

再度、確認しに行きますと
しっかりとutf8となっています。
以上でエラー解決とさせていただきます。
最後まで、お読み頂きありがとうございます。
誤った認識をしている箇所、認識が不足している部分について、ご指摘して頂けますと幸いに存じます。