次のコマンドを実行しました:
ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
次のエラーメッセージが表示されました:
#1071 - Specified key was too long; max key length is 767 bytes
列1と列2に関する情報:
column1 varchar(20) utf8_general_ci
column2 varchar(500) utf8_general_ci
varchar(20)
必要なのは 21 バイトだけだと思いますが、varchar(500)
必要なのは 501 バイトだけです。つまり、合計バイト数は 522 で、767 未満です。それでは、なぜエラー メッセージが表示されるのでしょうか?
#1071 - Specified key was too long; max key length is 767 bytes
ベストアンサー1
MySQLバージョン5.6(およびそれ以前のバージョン)では767バイトですが、指定された接頭辞制限InnoDB テーブルの場合は 1,000 バイトです。MyISAM テーブルの場合は 1,000 バイトです。この制限は、MySQL バージョン 5.7 (およびそれ以降) では 3072 バイトに増加されました。
varchar
また、エンコードされた大きな文字またはフィールドにインデックスを設定する場合utf8mb4
、最大インデックス プレフィックス長 767 バイト (または 3072 バイト) を 4 で割って191になることに注意してください。これは、文字の最大長が 4 バイトであるためですutf8mb4
。文字の場合は3 バイトとなり、最大インデックス プレフィックス長は255 (またはヌル終端文字を引いた 254 文字)utf8
になります。
1 つの選択肢は、フィールドに下限を設定することですVARCHAR
。
もう一つの選択肢(この問題に対する反応) は、列全体ではなく、列のサブセットを取得します。つまり、
ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );
適用するキーを取得する必要があるため、微調整が必要ですが、このエンティティに関するデータ モデルを見直して、改善の余地があるかどうかを確認する価値があるかどうか疑問に思います。改善の余地があると、MySQL の制限に達することなく、意図したビジネス ルールを実装できるようになります。