Sin dalla versione 10.3.1, MariaDB ha incluso sia un LENGTH()
funzione e un LENGTHB()
funzione.
Quel secondo ha una B
alla fine del nome. Quindi è un po' come Length A
e Length B
, tranne che Length A
non ha la A
.
Confuso?
Lo ero, quando ho incontrato per la prima volta LENGTHB()
. Sapevo già di LENGTH()
, quindi perché la necessità di una versione “B”?
Scopriamolo.
Compatibilità Oracle
Secondo MariaDB numero 12783, prima di LENGTHB()
è stato introdotto (e prima di LENGTH()
è stato modificato) le cose hanno funzionato in questo modo:
- MariaDB traduce la funzione
LENGTH()
alla funzione SQL StandardOCTET_LENGTH()
. - Oracle traduce la funzione
LENGTH()
alla funzione SQL StandardCHAR_LENGTH()
.
È stata quindi presa la decisione di modificare LENGTH()
di MariaDB funzione in modo che si comporti in modo diverso, a seconda della modalità SQL in cui è in esecuzione. In particolare:
- Quando si esegue in modalità predefinita (ad esempio
sql_mode=DEFAULT
), MariaDB continuerà a tradurreLENGTH()
aOCTET_LENGTH()
. - Tuttavia, durante l'esecuzione in modalità Oracle (ad esempio
sql_mode=ORACLE
), traduceLENGTH()
aCHAR_LENGTH()
invece.
Presentazione di LENGTHB()
Il che ci porta al LENGTHB()
funzione.
Il LENGTHB()
funzione è stata aggiunta come parte dello stesso lavoro.
LENGTHB()
è sinonimo di OCTET_LENGTH()
indipendentemente dalla modalità SQL. In altre parole, LENGTHB()
si traduce in OCTET_LENGTH()
quando sql_mode=DEFAULT
e quando sql_mode=ORACLE
.
Questo ci consente di utilizzare LENGTHB()
nel nostro codice senza preoccuparsi che venga influenzato dalla sql_mode
dell'utente impostazioni.
La differenza
La differenza tra queste due funzioni è illustrata nella tabella seguente.
Funzione | Modalità predefinita | Modalità Oracle |
---|---|---|
LENGTH() | Restituisce il numero di byte. | Restituisce il numero di caratteri. |
LENGTHB() | Restituisce il numero di byte. | Restituisce il numero di byte. |
Nota che questa differenza è presente solo da MariaDB 10.3.1. Prima di ciò, LENGTHB()
non esiste e LENGTH()
si traduce semplicemente in OCTET_LENGTH()
.
Esempio
Ecco un esempio che dimostra la differenza tra LENGTH()
e LENGTHB()
.
Impostiamo la nostra sessione per utilizzare la modalità predefinita:
SET SESSION sql_mode=DEFAULT;
Probabilmente la mia sessione era già nella modalità predefinita, ma non c'è nulla di male nell'impostarla esplicitamente.
Ora eseguiamo LENGTH()
e LENGTHB()
con lo stesso argomento:
SELECT
LENGTH('café'),
LENGTHB('café');
Risultato:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 5 | 5 | +-----------------+------------------+
Quindi, quando sono in modalità predefinita, entrambi restituiscono lo stesso valore.
In questo caso, entrambi hanno restituito 5
, perché ci sono 5 byte in quella stringa (il é
il carattere usa 2 byte e tutti gli altri usano 1 byte ciascuno).
Passiamo ora alla modalità Oracle:
SET SESSION sql_mode=ORACLE;
Ora eseguiamo nuovamente l'istruzione di cui sopra:
SELECT
LENGTH('café'),
LENGTHB('café');
Risultato:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 4 | 5 | +-----------------+------------------+
Questa volta c'è una differenza tra le due funzioni. Questa volta LENGTH()
restituito 4
. È 1 in meno rispetto a prima.
Questo perché LENGTH()
si comporta diversamente in modalità Oracle. Come accennato, quando sql_mode=ORACLE
, il LENGTH()
la funzione si traduce in CHAR_LENGTH()
, che restituisce il numero di caratteri, non byte.
Nell'esempio precedente, LENGTH()
ha restituito il numero di byte perché, quando sql_mode=DEFAULT
, si traduce in OCTET_LENGTH()
.