Eu entendo que, se o comprimento for > 255, serão necessários 2 bytes para armazenar o prefixo de comprimento. Só preciso verificar minhas suposições. Por favor, diga-me o prefixo de comprimento e o comprimento de string('abcd') para charsets(latin1, ucs2, utf8mb4). Para uma coluna varchar(20). A documentação diz:
[...] Para a string 'abcd', L é 4 e o requisito de armazenamento é de cinco bytes. Se a mesma coluna for declarada para usar o conjunto de caracteres de byte duplo ucs2, o requisito de armazenamento é de 10 bytes : O comprimento de 'abcd' é oito bytes e a coluna requer dois bytes para armazenar comprimentos porque o comprimento máximo é maior que 255 (até 510 bytes). [...]
Referência: 11.7 Requisitos de armazenamento de tipo de dados (Oracle | Documentos)
Eu só não entendo por que para 'abcd' com charset 'ucs2' requer um prefixo de comprimento de 2 bytes mesmo depois de ser menor que 255.
abcd
é todo em inglês, então: 9 bytes para ucs2; 5 bytes para utf8. Mas...UCS2 usa 2 bytes por caractere (pelo menos para letras 'ocidentais'). Eu acho que leva 4 bytes para a maioria dos caracteres asiáticos.
utf8 (ou utf8mb4) é uma codificação de comprimento variável. As letras inglesas ocupam 1 byte cada; a maioria dos textos europeus ocupa 1 ou 2 bytes por caractere. Asiático leva 3, às vezes 4 bytes por caractere.
latin1 tem apenas caracteres de 1 byte, portanto, é limitado ao inglês, além de algumas letras europeias acentuadas.
Mas, mas...
VARCHAR(40)
armazena até 40 caracteres ( não bytes ) em qualquer codificação que esteja sendo usada. O espaço em disco deve ser de 1 byte para comprimento mais até 4*40 bytes para texto. Um longo exemplo seria 40 Emoji, ocupando 161 bytes.<opinion>
Praticamente não há razão para usar oCHARACTER SET
ucs2 (ou ucs4). Em particular, qualquer coisa envolvendo unicode ou utf8 deve usarutf8mb4
.</opinion>
Mas Mas Mas...
Sobre seu comentário sobre 10 bytes -- O InnoDB às vezes usa 1 byte para o comprimento, às vezes 2. Mas a decisão é baseada em todas as colunas da tabela. Seu "40" não força um comprimento de 2 bytes, mas alguma outra coluna pode.
A documentação diz "Por exemplo, uma
VARCHAR(255)
coluna ... (até 510 bytes)". Portanto, ele precisa de 2 bytes, pois o comprimento máximo de bytes é > 255. Seu exemplo é com "VARCHAR(40)", que é "até 80 bytes" (<=255).