MySQL - length () vs char_length ()

215

Qual é a principal diferença entre length()e char_length()?

Eu acredito que tem algo a ver com cadeias binárias e não binárias. Existe alguma razão prática para armazenar seqüências de caracteres como binárias?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
Yada
fonte
2
Sim, existem razões práticas para armazenar cadeias binárias quando elas realmente são binárias, por exemplo, compactadas.
14139 sanmai

Respostas:

351

LENGTH()retorna o comprimento da string medida em bytes .
CHAR_LENGTH()retorna o comprimento da sequência medida em caracteres .

Isso é especialmente relevante para Unicode, no qual a maioria dos caracteres é codificada em dois bytes. Ou UTF-8, onde o número de bytes varia. Por exemplo:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

Como você pode ver, o símbolo do Euro ocupa 3 bytes (é codificado como 0xE282ACem UTF-8), embora seja apenas um caractere.

Andomar
fonte
6
Somente o UCS-2 é codificado em dois bytes por caractere. Essa codificação (ou com mais precisão UTF-16LE) é o que o Windows chama enganosamente de "Unicode". O MySQL não suporta UTF-16; em vez disso, a abordagem usual para colocar seqüências de caracteres Unicode é usar UTF-8.
bobince
2
Por exemplo: selecione length ('日本語'), char_length ('日本語');
14139 sanmai
@bince: Até o UCS-2 codifica alguns caracteres em mais de 2 bytes, por exemplo 0313 combining comma above. Como a = 61, 0x00610313 é exibido como a̓ e ocupa 4 bytes.
Andomar 14/11/2009
2
Na verdade, pela terminologia Unicode ainda possui 2 caracteres, embora, como todas as marcas combinadas, ela possa - se uma fonte adequada estiver disponível - ser renderizada como um único glifo. O UTF-16LE ainda pode ter um caractere de 4 bytes, graças aos substitutos.
bobince
6
Então, qual dessas funções devo usar ao descobrir como redimensionar minhas colunas VARCHAR? Ao criar a tabela, digamos que uma coluna seja um VARCHAR (10). Isso permitirá um máximo de 10 caracteres ou um máximo de 10 bytes?
still_dreaming_1
19

varchar (10) armazenará 10 caracteres, que podem ter mais de 10 bytes. Nos índices, ele alocará o comprimento máximo do campo - portanto, se você estiver usando UTF8-mb4, ele alocará 40 bytes para o campo de 10 caracteres.

Brent
fonte