MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():Qual é a diferença?


Desde a versão 10.3.1, o MariaDB incluiu um LENGTH() função e um LENGTHB() função.

Esse segundo tem um B no final do nome. Então é como Length A e Length B , exceto que Length A não tem o A .

Confuso?

Eu estava, quando encontrei LENGTHB() pela primeira vez . Eu já sabia sobre LENGTH() , então por que a necessidade de uma versão “B”?

Vamos descobrir.

Compatibilidade com Oracle


De acordo com o problema 12783 do MariaDB, antes de LENGTHB() foi introduzido (e antes de LENGTH() foi modificado) as coisas funcionaram assim:
  • MariaDB traduz a função LENGTH() para a função padrão SQL OCTET_LENGTH() .
  • O Oracle traduz a função LENGTH() para a função padrão SQL CHAR_LENGTH() .

Foi então tomada a decisão de alterar o LENGTH() do MariaDB função para que se comporte de maneira diferente, dependendo do modo SQL em que está sendo executado. Especificamente:
  • Ao executar no modo padrão (ou seja, sql_mode=DEFAULT ), MariaDB continuará traduzindo LENGTH() para OCTET_LENGTH() .
  • No entanto, ao executar no modo Oracle (ou seja, sql_mode=ORACLE ), ele traduz LENGTH() para CHAR_LENGTH() em vez disso.

Apresentando LENGTHB()


O que nos leva ao LENGTHB() função.

O LENGTHB() função foi adicionada como parte do mesmo trabalho.

LENGTHB() é sinônimo de OCTET_LENGTH() independentemente do modo SQL. Em outras palavras, LENGTHB() traduz para OCTET_LENGTH() quando sql_mode=DEFAULT e quando sql_mode=ORACLE .

Isso nos permite usar LENGTHB() em nosso código sem se preocupar em ser afetado pelo sql_mode do usuário definições.

A diferença


A diferença entre essas duas funções é descrita na tabela a seguir.
Função Modo padrão Modo Oráculo
LENGTH() Retorna o número de bytes. Retorna o número de caracteres.
LENGTHB() Retorna o número de bytes. Retorna o número de bytes.

Observe que essa diferença está presente apenas no MariaDB 10.3.1. Antes disso, LENGTHB() não existe e LENGTH() simplesmente traduz para OCTET_LENGTH() .

Exemplo


Aqui está um exemplo que demonstra a diferença entre LENGTH() e LENGTHB() .

Vamos configurar nossa sessão para usar o modo padrão:
SET SESSION sql_mode=DEFAULT;

Minha sessão provavelmente já estava no modo padrão, mas não há mal nenhum em defini-la explicitamente.

Agora vamos executar LENGTH() e LENGTHB() com o mesmo argumento:
SELECT 
    LENGTH('café'),
    LENGTHB('café');

Resultado:
+-----------------+------------------+
| LENGTH('café')  | LENGTHB('café')  |
+-----------------+------------------+
|               5 |                5 |
+-----------------+------------------+

Portanto, quando no modo padrão, ambos retornam o mesmo valor.

Nesse caso, ambos retornaram 5 , porque há 5 bytes nessa string (o é caractere usa 2 bytes e todos os outros usam 1 byte cada).

Agora vamos mudar para o modo Oracle:
SET SESSION sql_mode=ORACLE;

Agora vamos executar novamente a declaração acima:
SELECT 
    LENGTH('café'),
    LENGTHB('café');

Resultado:
+-----------------+------------------+
| LENGTH('café')  | LENGTHB('café')  |
+-----------------+------------------+
|               4 |                5 |
+-----------------+------------------+

Desta vez, há uma diferença entre as duas funções. Desta vez LENGTH() retornou 4 . Isso é 1 a menos do que anteriormente.

Isso ocorre porque LENGTH() se comporta de forma diferente no modo Oracle. Como mencionado, quando sql_mode=ORACLE , o LENGTH() função traduz para CHAR_LENGTH() , que retorna o número de caracteres – não bytes.

No exemplo anterior, LENGTH() retornou o número de bytes porque, quando sql_mode=DEFAULT , ele se traduz em OCTET_LENGTH() .