MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():Jaka jest różnica?

Od wersji 10.3.1 MariaDB zawierała zarówno LENGTH() funkcja i LENGTHB() funkcja.

Ten drugi ma B na końcu nazwy. To trochę jak Length A i Length B , z wyjątkiem tego, że Length A nie ma A .

Zdezorientowany?

Tak było, kiedy po raz pierwszy spotkałem LENGTHB() . Wiedziałem już o LENGTH() , więc dlaczego potrzebna jest wersja „B”?

Dowiedzmy się.

Zgodność z Oracle

Zgodnie z wydaniem MariaDB 12783, przed LENGTHB() został wprowadzony (i przed LENGTH() został zmodyfikowany) wszystko działało tak:

  • MariaDB tłumaczy funkcję LENGTH() do funkcji standardowej SQL OCTET_LENGTH() .
  • Oracle tłumaczy funkcję LENGTH() do funkcji standardowej SQL CHAR_LENGTH() .

Następnie podjęto decyzję o zmianie LENGTH() MariaDB funkcji, dzięki czemu zachowuje się inaczej, w zależności od tego, w jakim trybie SQL jest uruchomiony. W szczególności:

  • Gdy działa w trybie domyślnym (np. sql_mode=DEFAULT ), MariaDB będzie nadal tłumaczyć LENGTH() do OCTET_LENGTH() .
  • Jednak podczas pracy w trybie Oracle (tj. sql_mode=ORACLE ), tłumaczy LENGTH() do CHAR_LENGTH() zamiast tego.

Przedstawiamy LENGTHB()

Co prowadzi nas do LENGTHB() funkcjonować.

LENGTHB() funkcja została dodana w ramach tej samej pracy.

LENGTHB() jest synonimem OCTET_LENGTH() niezależnie od trybu SQL. Innymi słowy, LENGTHB() tłumaczy na OCTET_LENGTH() kiedy sql_mode=DEFAULT a kiedy sql_mode=ORACLE .

Dzięki temu możemy użyć LENGTHB() w naszym kodzie bez martwienia się, że ma na to wpływ sql_mode użytkownika ustawienia.

Różnica

Różnicę między tymi dwiema funkcjami przedstawiono w poniższej tabeli.

Funkcja Tryb domyślny Tryb Oracle
LENGTH() Zwraca liczbę bajtów. Zwraca liczbę znaków.
LENGTHB() Zwraca liczbę bajtów. Zwraca liczbę bajtów.

Zauważ, że ta różnica występuje tylko w MariaDB 10.3.1. Wcześniej LENGTHB() nie istnieje, a LENGTH() po prostu tłumaczy na OCTET_LENGTH() .

Przykład

Oto przykład, który pokazuje różnicę między LENGTH() i LENGTHB() .

Ustawmy naszą sesję na tryb domyślny:

SET SESSION sql_mode=DEFAULT;

Moja sesja prawdopodobnie była już w trybie domyślnym, ale nie zaszkodzi jej jawne ustawienie.

Teraz uruchommy LENGTH() i LENGTHB() z tym samym argumentem:

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

Wynik:

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

Tak więc w trybie domyślnym oba zwracają tę samą wartość.

W tym przypadku obaj zwrócili 5 , ponieważ w tym ciągu jest 5 bajtów (é znak używa 2 bajtów, a wszystkie inne używają 1 bajtu każdy).

Przejdźmy teraz do trybu Oracle:

SET SESSION sql_mode=ORACLE;

Teraz powtórzmy powyższe stwierdzenie:

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

Wynik:

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

Tym razem jest różnica między tymi dwiema funkcjami. Tym razem LENGTH() zwrócono 4 . To o 1 mniej niż poprzednio.

Dzieje się tak, ponieważ LENGTH() zachowuje się inaczej w trybie Oracle. Jak wspomniano, gdy sql_mode=ORACLE , LENGTH() funkcja tłumaczy na CHAR_LENGTH() , który zwraca liczbę znaków – nie bajtów.

W poprzednim przykładzie LENGTH() zwrócił liczbę bajtów, ponieważ gdy sql_mode=DEFAULT , tłumaczy się to na OCTET_LENGTH() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja MAX() w MariaDB

  2. Uruchamianie ProxySQL jako kontenera pomocniczego na Kubernetes

  3. Jak BIN() działa w MariaDB

  4. MariaDB POWER() wyjaśnione

  5. Wdrożenie w wielu chmurach do replikacji MariaDB przy użyciu WireGuard