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