Eu defini uma restrição única para duas colunas: Um bigint e um VARCHAR(256) COLLATE utf8mb4_unicode_ci
Então ocorreu este erro (com o qual já estou familiarizado):
Specified key was too long; max key length is 767 bytes
Em seguida, tentei definir o comprimento da coluna VARCHAR o mais alto possível sem obter um erro.
O que me surpreendeu foi que o MySQL me permitiu alterar o comprimento para 191, mas isso significaria que o índice tem 8+191*4=772 bytes, mas o erro disse que apenas 767 bytes são permitidos.
Esta é a tabela:
CREATE TABLE `file_content`
(
`file_content_id` bigint(20) NOT NULL AUTO_INCREMENT,
`local_filename` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`directory_id` bigint(20) NOT NULL,
...
PRIMARY KEY (`file_content_id`),
UNIQUE KEY `fc_dir_name` (`directory_id`,`local_filename`),
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Estou usando o MySQL 5.5.27
Matemática revisada:
2+764 < 767, então a coluna VARCHAR passa nesse teste
8+2+764 < 3KB, então todo o índice passa em outro teste. (Como faria um par de VARCHAR de 191 caracteres)
Editar
O manual de referência tem alguns limites complicados para índices. Geralmente você estará seguro com uma coluna ocupando não mais do que 767 bytes e o índice inteiro não ocupando mais do que 3072 bytes . Lembre-se de que um caractere em utf8mb4 conta (para esses limites) como 4 bytes . Eu tenho uma compilação de limites .