MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB() :Quelle est la différence ?

Depuis la version 10.3.1, MariaDB inclut à la fois un LENGTH() fonction et un LENGTHB() fonction.

Ce second a un B à la fin du nom. Donc c'est un peu comme Length A et Length B , sauf que Length A n'a pas le A .

Confus ?

J'étais, quand j'ai rencontré pour la première fois LENGTHB() . Je connaissais déjà LENGTH() , alors pourquoi avoir besoin d'une version "B" ?

Découvrons.

Compatibilité Oracle

Selon le problème MariaDB 12783, avant LENGTHB() a été introduit (et avant LENGTH() a été modifié) les choses ont fonctionné comme ceci :

  • MariaDB traduit la fonction LENGTH() à la fonction standard SQL OCTET_LENGTH() .
  • Oracle traduit la fonction LENGTH() à la fonction standard SQL CHAR_LENGTH() .

La décision a alors été prise de changer le LENGTH() de MariaDB fonction afin qu'il se comporte différemment, selon le mode SQL dans lequel il s'exécute. Plus précisément :

  • Lors de l'exécution en mode par défaut (c'est-à-dire sql_mode=DEFAULT ), MariaDB continuera à traduire LENGTH() à OCTET_LENGTH() .
  • Cependant, lors de l'exécution en mode Oracle (c'est-à-dire sql_mode=ORACLE ), il traduit LENGTH() à CHAR_LENGTH() à la place.

Présentation de LENGTHB()

Ce qui nous amène au LENGTHB() une fonction.

Le LENGTHB() fonction a été ajoutée dans le cadre du même travail.

LENGTHB() est un synonyme de OCTET_LENGTH() quel que soit le mode SQL. En d'autres termes, LENGTHB() se traduit par OCTET_LENGTH() quand sql_mode=DEFAULT et quand sql_mode=ORACLE .

Cela nous permet d'utiliser LENGTHB() dans notre code sans se soucier qu'il soit affecté par le sql_mode de l'utilisateur paramètres.

La différence

La différence entre ces deux fonctions est décrite dans le tableau suivant.

Fonction Mode par défaut Mode Oracle
LENGTHB() Renvoie le nombre d'octets. Renvoie le nombre de caractères.
LENGTHB() Renvoie le nombre d'octets. Renvoie le nombre d'octets.

Notez que cette différence n'est présente qu'à partir de MariaDB 10.3.1. Avant cela, LENGTHB() n'existe pas, et LENGTH() se traduit simplement par OCTET_LENGTH() .

Exemple

Voici un exemple qui montre la différence entre LENGTH() et LENGTHB() .

Configurons notre session pour utiliser le mode par défaut :

SET SESSION sql_mode=DEFAULT;

Ma session était probablement déjà en mode par défaut, mais il n'y a aucun mal à le définir explicitement.

Exécutons maintenant LENGTH() et LENGTHB() avec le même argument :

SELECT 
    LENGTH('café'),
    LENGTHB('café');

Résultat :

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

Ainsi, en mode par défaut, ils renvoient tous les deux la même valeur.

Dans ce cas, ils ont tous les deux renvoyé 5 , car il y a 5 octets dans cette chaîne (le é caractère utilise 2 octets et tous les autres utilisent 1 octet chacun).

Passons maintenant au mode Oracle :

SET SESSION sql_mode=ORACLE;

Maintenant, réexécutons l'instruction ci-dessus :

SELECT 
    LENGTH('café'),
    LENGTHB('café');

Résultat :

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

Cette fois, il y a une différence entre les deux fonctions. Cette fois LENGTH() a renvoyé 4 . C'est 1 de moins qu'auparavant.

C'est parce que LENGTH() se comporte différemment en mode Oracle. Comme mentionné, lorsque sql_mode=ORACLE , la LENGTHB() la fonction se traduit par CHAR_LENGTH() , qui renvoie le nombre de caractères - pas d'octets.

Dans l'exemple précédent, LENGTH() a renvoyé le nombre d'octets car, lorsque sql_mode=DEFAULT , il se traduit par OCTET_LENGTH() .