Ända sedan version 10.3.1 har MariaDB inkluderat både en LENGTH()
funktion och en LENGTHB()
funktion.
Den andra har en B
i slutet av namnet. Så det är ungefär som Length A
och Length B
, förutom att Length A
har inte A
.
Förvirrad?
Det var jag när jag först stötte på LENGTHB()
. Jag kände redan till LENGTH()
, så varför behövs en "B"-version?
Låt oss ta reda på det.
Oracle-kompatibilitet
Enligt MariaDB nummer 12783, före LENGTHB()
introducerades (och före LENGTH()
ändrades) saker fungerade så här:
- MariaDB översätter funktionen
LENGTH()
till SQL Standard-funktionenOCTET_LENGTH()
. - Oracle översätter funktionen
LENGTH()
till SQL Standard funktionCHAR_LENGTH()
.
Beslutet togs sedan att ändra MariaDB:s LENGTH()
fungerar så att den beter sig annorlunda beroende på vilket SQL-läge den körs i. Specifikt:
- När du kör i standardläge (dvs.
sql_mode=DEFAULT
), kommer MariaDB att fortsätta att översättaLENGTH()
tillOCTET_LENGTH()
. - Men när du kör i Oracle-läge (dvs.
sql_mode=ORACLE
), översätter denLENGTH()
tillCHAR_LENGTH()
istället.
Vi presenterar LENGTHB()
Vilket för oss till LENGTHB()
fungera.
LENGTHB()
funktion lades till som en del av samma arbete.
LENGTHB()
är en synonym för OCTET_LENGTH()
oavsett SQL-läge. Med andra ord, LENGTHB()
översätts till OCTET_LENGTH()
när sql_mode=DEFAULT
och när sql_mode=ORACLE
.
Detta gör det möjligt för oss att använda LENGTHB()
i vår kod utan att oroa dig för att den påverkas av användarens sql_mode
inställningar.
Skillnaden
Skillnaden mellan dessa två funktioner beskrivs i följande tabell.
Funktion | Standardläge | Oracle Mode |
---|---|---|
LENGTH() | Returnerar antalet byte. | Returnerar antalet tecken. |
LENGTHB() | Returnerar antalet byte. | Returnerar antalet byte. |
Observera att denna skillnad endast finns från MariaDB 10.3.1. Innan dess, LENGTHB()
existerar inte, och LENGTH()
översätts helt enkelt till OCTET_LENGTH()
.
Exempel
Här är ett exempel som visar skillnaden mellan LENGTH()
och LENGTHB()
.
Låt oss ställa in vår session på att använda standardläget:
SET SESSION sql_mode=DEFAULT;
Min session var förmodligen redan i standardläget, men det skadar inte att uttryckligen ställa in det.
Låt oss nu köra LENGTH()
och LENGTHB()
med samma argument:
SELECT
LENGTH('café'),
LENGTHB('café');
Resultat:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 5 | 5 | +-----------------+------------------+
Så när de är i standardläge returnerar de båda samma värde.
I det här fallet returnerade de båda 5
, eftersom det finns 5 byte i den strängen (é
tecken använder 2 byte, och alla andra använder 1 byte var).
Låt oss nu byta till Oracle-läge:
SET SESSION sql_mode=ORACLE;
Låt oss nu köra ovanstående uttalande igen:
SELECT
LENGTH('café'),
LENGTHB('café');
Resultat:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 4 | 5 | +-----------------+------------------+
Den här gången är det skillnad mellan de två funktionerna. Den här gången LENGTH()
returnerade 4
. Det är 1 mindre än tidigare.
Detta beror på att LENGTH()
beter sig annorlunda i Oracle-läge. Som nämnts, när sql_mode=ORACLE
, LENGTH()
funktion översätts till CHAR_LENGTH()
, som returnerar antalet tecken – inte byte.
I föregående exempel, LENGTH()
returnerade antalet byte eftersom, när sql_mode=DEFAULT
, det översätts till OCTET_LENGTH()
.