1. ホーム
  2. mysql

[解決済み】MySQLエラー#1071 - 指定されたキーが長すぎる; キーの最大長は767バイトです。

2022-02-09 15:01:18

質問

以下のコマンドを実行したところ

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

このようなエラーメッセージが表示されました。

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

column1、column2に関する情報。

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

解決方法は?

MySQL バージョン 5.6 で 767 バイト。 (およびそれ以前のバージョン)では 記載された接頭辞の制限 InnoDBテーブルの場合。MyISAMテーブルでは1,000バイト長です。この制限は 3072 bytes MySQL バージョン 5.7 では (およびそれ以上)です。

また、大きな文字(char)のインデックスを設定した場合や varchar フィールドが utf8mb4 でエンコードされている場合、 インデックスプリフィックスの最大長である 767 バイト (あるいは 3072 バイト) を 4 で割った結果が以下のようになります。 191 . これは utf8mb4 文字は4バイトです。このため utf8 文字の場合、3 バイトとなり、最大インデックスプリフィックスの長さは 255 (またはヌルターミネータを引いた254文字)。

に下限を設けるという方法もあります。 VARCHAR フィールドを作成します。

もう一つの選択肢は、( この問題に対する回答 ) は、全額ではなく、列の部分集合を取得する、すなわち。

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

キーを適用するために必要な微調整を行いますが、このエンティティに関するデータモデルを見直して、MySQLの制限を受けることなく意図したビジネスルールを実装できるような改善が可能かどうかを確認する価値はあるかと思われます。