web-dev-qa-db-ja.com

MySqlの修正方法:インデックス列のサイズが大きすぎる(Laravelの移行)

Debian、Nginx、PhpMyAdminなどをインストールする迷惑メールボックスを使用してプロジェクトを複製しました。新しいプロジェクトでは、Laravelのphp artisan migrateはもう機能しておらず、エラーが表示されます。

[Illuminate\Database\QueryException]                                                                                                                                      
  SQLSTATE[HY000]: General error: 1709 Index column size too large. The maximum column size is 767 bytes. (SQL: alter table `courses` add unique `courses_name_unique`(`na  
  me`))

作業中のプロジェクトデータベースのダンプ(構造+データ)を作成し、データベースにインポートすると、移行時にエラーが発生します。すべてが正常で、すべてのテーブルが作成され、データがインポートされます。

移行方法を実行できるようにサイズを修正するにはどうすればよいですか?

16
Sven van Zoelen

インデックスを作成する場合は、エラーメッセージ「最大列サイズは767バイトです」で確認できます。 VARCHAR(255)列は、_utf8_を使用すると最大765(255 * 3)バイト、_utf8mb4_を使用すると1020(255 * 4)バイトを使用できます。これは、MySQLでは_utf8_が最大3バイト、_utf8mb4_が最大4バイト(実際のUTF8)であるためです。したがって、VARCHAR(255)(一意の)インデックスを_utf8mb4_で作成すると失敗します。

これは、問題を解決するためのオプションです。

_my.ini_でデフォルトの照合を設定します:

_collation_server=utf8_unicode_ci
character_set_server=utf8
_

作成時にデータベースのデフォルトの照合を設定します。

_CREATE DATABASE IF NOT EXISTS `your_db` COLLATE 'utf8_unicode_ci'
_

テーブル/列のデフォルトの照合を設定します。 (私はお勧めしません)

列サイズを190(varchar(190))以下に変更します。

Laravel 5.4修正

Mysqlサーバーの設定は、Laravelの移行コマンドによって上書きされます。照合と文字セットを構成のバージョンに設定します。

_config/database.php_にあるデータベース構成ファイルのdbエンジンのcharsetおよびcollationフィールドを変更します。

_..
'mysql' => [
            'driver' => 'mysql',
            'Host' => env('DB_Host', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            //'charset' => 'utf8mb4',
            //'collation' => 'utf8mb4_unicode_ci',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
..
_
39
Paul Spiegel

Mariadbの場合、*my.cnf次の構成のファイル、

innodb_default_row_format=dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true

次に、更新された構成を有効にするためにmariadbサービスを再起動する必要があります。

11
Pratik

それぞれに欠点がある3つのソリューション:

  • MySQL 5.7は問題を回避します。アップグレードを検討してください。

  • VARCHAR(255)は通常、必要よりも大きい変数です。 191以下に安全に縮小できる場合、エラーはなくなります。

  • (utf8mb4から)utf8に切り替えます。if中国語または絵文字は必要ありません。

6
Rick James

デフォルトでは、MySQLは文字セットutf8を使用します。つまり、1文字ごとに3バイトを使用します。つまり、varchar(10)の列タイプは30バイトを使用するため、コンパクト行フォーマットの最大プレフィックスサイズはvarchar(255)と同等になります。これは、255 * 3バイト= 765バイト、つまり最大767バイトより2バイト少ないです。

Innodb_large_prefixをonに設定し、行形式COMPRESSEDまたはDYNAMICを使用して、最大プレフィックス文字サイズを767バイトではなく65536バイトに増やすことができます。次のグラフは、InnoDBの大きなプレフィックスと[COMPRESSED |動的]行フォーマット。 utf8mb4に予想されるこれらの値は、テーブルの最大行サイズよりも大きいため、これらの制限に達する方法はありません。

詳細はこちら https://discuss.pivotal.io/hc/en-us/articles/115004086747-Apps-are-down-due-to-the-Maximum-Column-Size-is-767-bytes -Constraint-in-MySQL

1

また、db接続スクリプトでutf8mb4_unicode_ciからutf8_unicode_ciに戻しただけで、この問題が発生しました。

0
Fulela

5.5.52-MariaDBで動作します。

すべてのエンコーディングをutf8_general_ci(サーバー、データベース、接続)。

0
Anton