- INDEXのサイズには制限があります。 utf8mb4には最大4バイトが必要なため、制限にぶつかりました。 文字ごと 、utf8に必要なのは3つだけです。一方、INDEXのサイズ制限はバイトです。 。
「解決策」は、特大のインデックスをどうするかを決めることです。 (以下で詳しく説明します)
2.
ALTER TABLE t CHANGE col col ...
より論理的なものと同じです
ALTER TABLE t MODIFY col ...
前者では列の名前を変更できるため、名前を変更する必要がない場合は、列名のコピーが2つあります。
-
VARCHAR(255)
を持っている可能性が非常に高いです これはutf8で767バイトを使用します(3 * 255 + 2;「2」は長さフィールドのサイズです)。 4バイトのutf8mb4に相当するものは、(191)(4 * 191 + 2 =766; 191を超える余地はありません)です。 -
私はそれについての記事を見たことがありません。私が今言ったことは、言わなければならないことのほとんどだと思います。
だから...
計画A :foo VARCHAR(255)
はありますか そしてそれはutf8でしたか?その中のデータは常に(現在および将来)191文字より短いですか?その場合は、ALTERを実行してください。
計画B :191以上が必要な場合、本当にINDEXが必要ですか? DROPINDEXが代わりになるかもしれません。
計画C :または、「プレフィックス」インデックスを使用できます:INDEX(foo(191))
、そのままにしてVARCHAR(255)
。通常、「プレフィックス」インデックスは役に立ちませんが、可能性があります それが機能するユースケースがあります。
これについてさらに議論するには、SHOW CREATE TABLE
を提供してください 問題のテーブルについて、その特定のフィールドとそのINDEXの意味について話し合います。