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 SQLOCTET_LENGTH()
. - Oracle traduit la fonction
LENGTH()
à la fonction standard SQLCHAR_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 à traduireLENGTH()
àOCTET_LENGTH()
. - Cependant, lors de l'exécution en mode Oracle (c'est-à-dire
sql_mode=ORACLE
), il traduitLENGTH()
à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()
.