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() .