Encontramos este problema al intentar agregar un índice ÚNICO a un campo VARCHAR (255) usando utf8mb4. Si bien el problema ya se describe bien aquí, quería agregar algunos consejos prácticos sobre cómo resolvimos esto y lo resolvimos.
Cuando se usa utf8mb4, los caracteres cuentan como 4 bytes, mientras que bajo utf8, pueden tener 3 bytes. Las bases de datos de InnoDB tienen un límite que los índices solo pueden contener 767 bytes. Entonces, cuando use utf8, puede almacenar 255 caracteres (767/3 = 255), pero usando utf8mb4, solo puede almacenar 191 caracteres (767/4 = 191).
Es absolutamente capaz de agregar índices regulares para VARCHAR(255)
campos usando utf8mb4, pero lo que sucede es que el tamaño del índice se trunca en 191 caracteres automáticamente, como unique_key
aquí:
Esto está bien, porque los índices regulares solo se usan para ayudar a MySQL a buscar sus datos más rápidamente. No es necesario indexar todo el campo.
Entonces, ¿por qué MySQL trunca el índice automáticamente para los índices regulares, pero arroja un error explícito al intentar hacerlo para índices únicos? Bueno, para que MySQL pueda determinar si el valor que se está insertando o actualizando ya existe, necesita indexar todo el valor y no solo parte de él.
Al final del día, si desea tener un índice único en un campo, todo el contenido del campo debe caber en el índice. Para utf8mb4, esto significa reducir las longitudes de campo de VARCHAR a 191 caracteres o menos. Si no necesita utf8mb4 para esa tabla o campo, puede soltarlo nuevamente a utf8 y mantener sus 255 campos de longitud.