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 3 years have passed since last update.

文字コードの指定ミスによる、マイグレーションファイルが実行できないエラーについて。

Last updated at Posted at 2020-09-06
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を確認しにいきます、
文字コードに関連しているだろう記述がある部分を見つけました。

10e5c8a893f7e8c6452c104aa1e9bb54.png

utf8mb4のままの部分がございます。

データベースのリセットを一度行います。

rails db:reset

その上でマイグレーションファイルを実行いたします。

rails db:migrate

今回はエラー文が表示されませんでした。

再度、確認しに行きますと
しっかりとutf8となっています。

935e08cdb5323459dc9b03759ee1426e.png

以上でエラー解決とさせていただきます。

最後まで、お読み頂きありがとうございます。
誤った認識をしている箇所、認識が不足している部分について、ご指摘して頂けますと幸いに存じます。

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?