sql >> Database >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():wat is het verschil?

Sinds versie 10.3.1 heeft MariaDB zowel een LENGTH() functie en een LENGTHB() functie.

Die tweede heeft een B aan het einde van de naam. Dus het is een beetje zoals Length A en Length B , behalve dat Length A heeft niet de A .

Verward?

Dat was ik ook, toen ik LENGTHB() voor het eerst tegenkwam . Ik wist al van LENGTH() , dus waarom de behoefte aan een “B”-versie?

Laten we het uitzoeken.

Oracle-compatibiliteit

Volgens MariaDB-uitgave 12783, vóór LENGTHB() werd geïntroduceerd (en vóór LENGTH() werd gewijzigd) werkten de dingen als volgt:

  • MariaDB vertaalt functie LENGTH() naar SQL Standaardfunctie OCTET_LENGTH() .
  • Oracle vertaalt functie LENGTH() naar SQL Standaardfunctie CHAR_LENGTH() .

Er werd toen besloten om MariaDB's LENGTH() . te wijzigen functie, zodat het zich anders gedraagt, afhankelijk van de SQL-modus waarin het wordt uitgevoerd. Specifiek:

  • In de standaardmodus (d.w.z. sql_mode=DEFAULT ), zal MariaDB doorgaan met het vertalen van LENGTH() naar OCTET_LENGTH() .
  • Bij het uitvoeren in Oracle-modus (d.w.z. sql_mode=ORACLE ), vertaalt het LENGTH() naar CHAR_LENGTH() in plaats daarvan.

Introductie van LENGTHB()

Dat brengt ons bij de LENGTHB() functie.

De LENGTHB() functie is toegevoegd als onderdeel van hetzelfde werk.

LENGTHB() is een synoniem voor OCTET_LENGTH() ongeacht de SQL-modus. Met andere woorden, LENGTHB() vertaalt naar OCTET_LENGTH() wanneer sql_mode=DEFAULT en wanneer sql_mode=ORACLE .

Dit stelt ons in staat om LENGTHB() . te gebruiken in onze code zonder dat u zich zorgen hoeft te maken dat deze wordt beïnvloed door de sql_mode van de gebruiker instellingen.

Het verschil

Het verschil tussen deze twee functies wordt uiteengezet in de volgende tabel.

Functie Standaardmodus Oracle-modus
LENGTH() Retourneert het aantal bytes. Retourneert het aantal tekens.
LENGTHB() Retourneert het aantal bytes. Retourneert het aantal bytes.

Merk op dat dit verschil alleen aanwezig is vanaf MariaDB 10.3.1. Daarvoor was LENGTHB() bestaat niet, en LENGTH() vertaalt zich eenvoudig naar OCTET_LENGTH() .

Voorbeeld

Hier is een voorbeeld dat het verschil laat zien tussen LENGTH() en LENGTHB() .

Laten we onze sessie instellen om de standaardmodus te gebruiken:

SET SESSION sql_mode=DEFAULT;

Mijn sessie stond waarschijnlijk al in de standaardmodus, maar het kan geen kwaad om dit expliciet in te stellen.

Laten we nu LENGTH() . uitvoeren en LENGTHB() met hetzelfde argument:

SELECT 
    LENGTH('café'),
    LENGTHB('café');

Resultaat:

+-----------------+------------------+
| LENGTH('café')  | LENGTHB('café')  |
+-----------------+------------------+
|               5 |                5 |
+-----------------+------------------+

Dus in de standaardmodus retourneren ze allebei dezelfde waarde.

In dit geval gaven ze allebei 5 . terug , omdat er 5 bytes in die string zitten (de é karakter gebruikt 2 bytes en alle andere gebruiken elk 1 byte).

Laten we nu overschakelen naar de Oracle-modus:

SET SESSION sql_mode=ORACLE;

Laten we nu de bovenstaande verklaring herhalen:

SELECT 
    LENGTH('café'),
    LENGTHB('café');

Resultaat:

+-----------------+------------------+
| LENGTH('café')  | LENGTHB('café')  |
+-----------------+------------------+
|               4 |                5 |
+-----------------+------------------+

Deze keer is er een verschil tussen de twee functies. Deze keer LENGTH() 4 geretourneerd . Dat is 1 minder dan voorheen.

Dit komt omdat LENGTH() gedraagt ​​zich anders in Oracle-modus. Zoals vermeld, wanneer sql_mode=ORACLE , de LENGTH() functie vertaalt naar CHAR_LENGTH() , die het aantal tekens retourneert - niet bytes.

In het vorige voorbeeld, LENGTH() het aantal bytes geretourneerd omdat, wanneer sql_mode=DEFAULT , het vertaalt zich naar OCTET_LENGTH() .


  1. MySQL selecteer coördinaten binnen bereik

  2. Softwarebedrijven die werken aan Oracle D2k, PLSQL Technologies in Noida

  3. Nuttige vragen over het verlopen van het Oracle EBS-wachtwoord/beleid/instellingen

  4. Hoe de functie Radians() werkt in PostgreSQL