Sejak versi 10.3.1, MariaDB telah menyertakan LENGTH() fungsi dan LENGTHB() fungsi.
Yang kedua memiliki B di akhir nama. Jadi ini seperti Length A dan Length B , kecuali Length A tidak memiliki A .
Bingung?
Ya, ketika saya pertama kali menemukan LENGTHB() . Saya sudah tahu tentang LENGTH() , jadi mengapa perlu versi “B”?
Mari kita cari tahu.
Kompatibilitas Oracle
Menurut masalah MariaDB 12783, sebelum LENGTHB() diperkenalkan (dan sebelum LENGTH() telah dimodifikasi) hal-hal bekerja seperti ini:
- MariaDB menerjemahkan fungsi
LENGTH()ke fungsi Standar SQLOCTET_LENGTH(). - Oracle menerjemahkan fungsi
LENGTH()ke fungsi Standar SQLCHAR_LENGTH().
Keputusan kemudian dibuat untuk mengubah LENGTH() Maria MariaDB berfungsi sehingga berperilaku berbeda, tergantung pada mode SQL yang dijalankannya. Khususnya:
- Saat berjalan dalam mode default (yaitu
sql_mode=DEFAULT), MariaDB akan terus menerjemahkanLENGTH()keOCTET_LENGTH(). - Namun, saat dijalankan dalam mode Oracle (yaitu
sql_mode=ORACLE), ini menerjemahkanLENGTH()keCHAR_LENGTH()sebagai gantinya.
Memperkenalkan LENGTHB()
Yang membawa kita ke LENGTHB() fungsi.
LENGTHB() fungsi ditambahkan sebagai bagian dari pekerjaan yang sama.
LENGTHB() adalah sinonim untuk OCTET_LENGTH() terlepas dari mode SQL. Dengan kata lain, LENGTHB() diterjemahkan menjadi OCTET_LENGTH() ketika sql_mode=DEFAULT dan ketika sql_mode=ORACLE .
Ini memungkinkan kita untuk menggunakan LENGTHB() dalam kode kami tanpa khawatir akan terpengaruh oleh sql_mode pengguna pengaturan.
Perbedaan
Perbedaan antara kedua fungsi tersebut diuraikan dalam tabel berikut.
| Fungsi | Mode Default | Mode Oracle |
|---|---|---|
LENGTH() | Mengembalikan jumlah byte. | Mengembalikan jumlah karakter. |
LENGTHB() | Mengembalikan jumlah byte. | Mengembalikan jumlah byte. |
Perhatikan bahwa perbedaan ini hanya ada dari MariaDB 10.3.1. Sebelumnya, LENGTHB() tidak ada, dan LENGTH() cukup terjemahkan menjadi OCTET_LENGTH() .
Contoh
Berikut adalah contoh yang menunjukkan perbedaan antara LENGTH() dan LENGTHB() .
Mari kita atur sesi kita untuk menggunakan mode default:
SET SESSION sql_mode=DEFAULT; Sesi saya mungkin sudah dalam mode default, tetapi tidak ada salahnya mengaturnya secara eksplisit.
Sekarang mari kita jalankan LENGTH() dan LENGTHB() dengan argumen yang sama:
SELECT
LENGTH('café'),
LENGTHB('café'); Hasil:
+-----------------+------------------+
| LENGTH('café') | LENGTHB('café') |
+-----------------+------------------+
| 5 | 5 |
+-----------------+------------------+ Jadi, ketika dalam mode default, keduanya mengembalikan nilai yang sama.
Dalam hal ini, mereka berdua mengembalikan 5 , karena ada 5 byte dalam string tersebut (é karakter menggunakan 2 byte, dan yang lainnya menggunakan masing-masing 1 byte).
Sekarang mari kita beralih ke mode Oracle:
SET SESSION sql_mode=ORACLE; Sekarang mari kita ulangi pernyataan di atas:
SELECT
LENGTH('café'),
LENGTHB('café'); Hasil:
+-----------------+------------------+
| LENGTH('café') | LENGTHB('café') |
+-----------------+------------------+
| 4 | 5 |
+-----------------+------------------+
Kali ini ada perbedaan antara kedua fungsi tersebut. Kali ini LENGTH() mengembalikan 4 . Itu berkurang 1 dari sebelumnya.
Ini karena LENGTH() berperilaku berbeda dalam mode Oracle. Seperti yang disebutkan, ketika sql_mode=ORACLE , LENGTH() fungsi diterjemahkan menjadi CHAR_LENGTH() , yang mengembalikan jumlah karakter – bukan byte.
Pada contoh sebelumnya, LENGTH() mengembalikan jumlah byte karena, ketika sql_mode=DEFAULT , ini diterjemahkan menjadi OCTET_LENGTH() .