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 StandaardfunctieOCTET_LENGTH(). - Oracle vertaalt functie
LENGTH()naar SQL StandaardfunctieCHAR_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 vanLENGTH()naarOCTET_LENGTH(). - Bij het uitvoeren in Oracle-modus (d.w.z.
sql_mode=ORACLE), vertaalt hetLENGTH()naarCHAR_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() .