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