sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():Vad är skillnaden?

Ä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-funktionen OCTET_LENGTH() .
  • Oracle översätter funktionen LENGTH() till SQL Standard funktion CHAR_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ätta LENGTH() till OCTET_LENGTH() .
  • Men när du kör i Oracle-läge (dvs. sql_mode=ORACLE ), översätter den LENGTH() till CHAR_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() .


  1. Skapa underhållsplaner i SQL Server

  2. SQL-bulkimport från CSV

  3. Hur man skapar en login.sql-fil för SQLcl

  4. Hur LENGTH() fungerar i MariaDB