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