MariaDB
 sql >> Database >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():qual è la differenza?

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 Standard OCTET_LENGTH() .
  • Oracle traduce la funzione LENGTH() alla funzione SQL Standard CHAR_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 tradurre LENGTH() a OCTET_LENGTH() .
  • Tuttavia, durante l'esecuzione in modalità Oracle (ad esempio sql_mode=ORACLE ), traduce LENGTH() a CHAR_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() .