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`))
作業中のプロジェクトデータベースのダンプ(構造+データ)を作成し、データベースにインポートすると、移行時にエラーが発生します。すべてが正常で、すべてのテーブルが作成され、データがインポートされます。
移行方法を実行できるようにサイズを修正するにはどうすればよいですか?
インデックスを作成する場合は、エラーメッセージ「最大列サイズは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)
)以下に変更します。
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,
],
..
_
Mariadbの場合、*my.cnf
次の構成のファイル、
innodb_default_row_format=dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true
次に、更新された構成を有効にするためにmariadb
サービスを再起動する必要があります。
それぞれに欠点がある3つのソリューション:
MySQL 5.7は問題を回避します。アップグレードを検討してください。
VARCHAR(255)
は通常、必要よりも大きい変数です。 191以下に安全に縮小できる場合、エラーはなくなります。
(utf8mb4から)utf8に切り替えます。if中国語または絵文字は必要ありません。
デフォルトでは、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に予想されるこれらの値は、テーブルの最大行サイズよりも大きいため、これらの制限に達する方法はありません。
また、db接続スクリプトでutf8mb4_unicode_ciからutf8_unicode_ciに戻しただけで、この問題が発生しました。
5.5.52-MariaDBで動作します。
すべてのエンコーディングをutf8_general_ci
(サーバー、データベース、接続)。