質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

3回答

3239閲覧

LaravelでengineにInnoDBとするとインデックスサイズの制限が回避できるのはなぜ?

imojaga

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2019/07/03 04:01

編集2019/07/03 05:28

前提・実現したいこと

Laravelでphp artisan migrateとするとこのようなエラーがでて、解決としてこれが使えました

1071 - Specified key was too long; max key length is 767 bytes

https://qiita.com/ichi944/items/03e3bb0bbc97a965faf7

発生している問題・エラーメッセージ

このサイトでengineにinnoDBとしていると思いますがなぜこれでうまく動くようになるんでしょうか?

MySQLを使っている時点でinnoDBなのではないんでしょうか?

このサイトを読んでいるとMySQLのデフォルトデータベースエンジンはInnoDBだと書いてありました

MySQL 5.5.5 以降、新しいテーブル用のデフォルトのストレージエンジンは InnoDB です。この変更は、新たに作成されたテーブルの中で、ENGINE=MyISAM などの句を使用してストレージエンジンが指定されていないものに適用されます。

InnoDB is a good general transaction storage engine. It is the default storage engine from MariaDB 10.2 (as well as MySQL). For earlier releases, XtraDB is a performance enhanced fork of InnoDB and is usually preferred.

Laravelのエンジンの設定が初期値のnullだった場合にはデータベースエンジンにInnoDBが使われ、インデックスキー長のエラーはそもそも発生しなかったはずではないかと思うのですが、どうしてエンジンをLaravelのオプションで明示しなければいけないのでしょうか?

試したこと

調べてみても、上のサイトと同じ解決法だけが書いてあるページしか見つけられず、なぜこれでできるのかわかりません。

フレームワーク、使用ツールのバージョン

LaravelやPHPやMySQLのバージョンはこのようになっています。

  • mysql Ver 15.1 Distrib 10.2.10-MariaDB, for Win64 (AMD64)
  • Laravel 5.8
  • PHP 7.3.5 (cli) (built: May 1 2019 13:17:17) ( ZTS MSVC15 (Visual C++ 2017) x64 )
  • Windows 10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問の際はソフトウェアのバージョンも明記した方が適切なコメントが付きやすです。
MySQLのインデックスサイズに767byteまでしかつかえない問題と対策

これで、key長の制限が767バイトから、3072バイトに拡張されます。 ※MySQL5.7からは標準で、innodb_file_formatはBarracudaとなるため、記述が不要になります。

が参考になるかも?

投稿2019/07/03 04:09

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imojaga

2019/07/03 04:28

MySQL5.7からはinnoDBのインデックスキーサイズが拡張されたのですか(知りませんでした)。 このサイトを読んでいるとMySQLのデフォルトデータベースエンジンはInnoDBだと書いてありました https://dev.mysql.com/doc/refman/5.6/ja/innodb-default-se.html#idm140037797608992 >MySQL 5.5.5 以降、新しいテーブル用のデフォルトのストレージエンジンは InnoDB です。この変更は、新たに作成されたテーブルの中で、ENGINE=MyISAM などの句を使用してストレージエンジンが指定されていないものに適用されます。 Laravelのエンジンの設定が初期値のnullだった場合にはデータベースエンジンにInnoDBが使われ、インデックスキー長のエラーはそもそも発生しなかったはずではないかと思うのですが、どうしてエンジンをLaravelのオプションで明示しなければいけないのでしょうか?
Orlofsky

2019/07/03 04:47

データベースエンジンは一種の人工知能です。バージョン毎にもっともパフォーマンスが良いエンジンがデフォルトに設定されるのであろうと想像します。 現在のMySQLはオラクル社に買収されましたから、日本オラクル https://www.oracle.com/jp/index.html 右下のチャットから確認されては?たぶん、無料で答えてくれるでしょう。
guest

0

LaravelでMysqlのcharsetをutf8mb4にしてエラーが出るときの対応方法

上記質問にあるリンク先の情報で有用なのは、

mycnf

1innodb_file_format=BARRACUDA

でしょう。

また、config/database.phpdでのengineの指定については、リンク先に

version 5.7.9以降のデフォルトがDYNAMICとのことなのでそれに合わせて修正しました。

とありますので、質問者さんの環境ではengineと合わせてデフォルトでも問題無いでしょうから、指定は不要だと思います。

投稿2019/07/03 05:49

編集2019/07/03 06:01
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imojaga

2019/07/03 05:55 編集

innodb_file_formatで3072バイトに拡張しているのでたしかに着眼する点がずれていたかもしれません。 私も指定が不要だと思っているのですが、実際にはengineを明示しなければエラーが発生してしまいます。 これまで頂いた情報からMySQLよりLaravelの問題と思うのでLaravelのサイトに見逃しがないか見てみます
guest

0

バージョンにmariadbと書いてありますが
mariadbとmysqlは厳密には違います。
mariadbはmysqlから派生したmysql互換のRDBMSです。
バージョンも 10.2.10と書いてありますが
これは、mysqlでいうところの5.6~5.7の間のようです。
ですので、mysqlのマニュアルを読むときにバージョンの表記に気をつける必要があるとの
明確にどのバージョンとコンパチと書いてないので、若干の設定の差があるように思えます。

https://mariadb.com/kb/en/library/innodb-storage-formats/#setting-a-tables-row-format

ここによると

In MariaDB 10.2.1 and before, the default row format is COMPACT

In MariaDB 10.2.2 and later, the default row format is DYNAMIC.

なので質問者さんのところではDYNAMICっぽいですが
innodb_default_row_formatを確認するのが確実っぽいですね。

投稿2019/07/03 11:16

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問