MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():Apa Bedanya?

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 SQL OCTET_LENGTH() .
  • Oracle menerjemahkan fungsi LENGTH() ke fungsi Standar SQL CHAR_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 menerjemahkan LENGTH() ke OCTET_LENGTH() .
  • Namun, saat dijalankan dalam mode Oracle (yaitu sql_mode=ORACLE ), ini menerjemahkan LENGTH() ke CHAR_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() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Upgrade Tanpa Waktu Henti Menjadi Mudah dengan ClusterControl

  2. Menjalankan ProxySQL sebagai Layanan Kubernetes

  3. Bagaimana UTC_TIME() Bekerja di MariaDB

  4. Bagaimana TIDAK RLIKE Bekerja di MariaDB

  5. Bagaimana MID() Bekerja di MariaDB