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