MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

MariaDB LENGTH () vs LENGTHB ():Sự khác biệt là gì?

Kể từ phiên bản 10.3.1, MariaDB đã bao gồm cả LENGTH() và một LENGTHB() chức năng.

Cái thứ hai đó có B ở cuối tên. Vì vậy, nó giống như Length ALength B , ngoại trừ Length A không có A .

Bạn bối rối?

Lần đầu tiên tôi gặp LENGTHB() . Tôi đã biết về LENGTH() , vậy tại sao lại cần phiên bản “B”?

Hãy cùng tìm hiểu.

Khả năng tương thích với Oracle

Theo MariaDB số 12783, trước LENGTHB() đã được giới thiệu (và trước LENGTH() đã được sửa đổi) mọi thứ hoạt động như thế này:

  • MariaDB dịch hàm LENGTH() sang hàm Chuẩn SQL OCTET_LENGTH() .
  • Oracle dịch hàm LENGTH() sang hàm Chuẩn SQL CHAR_LENGTH() .

Sau đó, quyết định được đưa ra là thay đổi LENGTH() của MariaDB để nó hoạt động khác nhau, tùy thuộc vào chế độ SQL mà nó đang chạy. Cụ thể:

  • Khi chạy ở chế độ mặc định (tức là sql_mode=DEFAULT ), MariaDB sẽ tiếp tục dịch LENGTH() thành OCTET_LENGTH() .
  • Tuy nhiên, khi chạy ở chế độ Oracle (tức là sql_mode=ORACLE ), nó dịch LENGTH() thành CHAR_LENGTH() thay vào đó.

Giới thiệu LENGTHB()

Điều này đưa chúng ta đến LENGTHB() hàm số.

LENGTHB() chức năng đã được thêm vào như một phần của cùng một công việc.

LENGTHB() là từ đồng nghĩa với OCTET_LENGTH() không phụ thuộc vào chế độ SQL. Nói cách khác, LENGTHB() dịch sang OCTET_LENGTH() khi sql_mode=DEFAULT và khi sql_mode=ORACLE .

Điều này cho phép chúng tôi sử dụng LENGTHB() trong mã của chúng tôi mà không phải lo lắng về việc nó bị ảnh hưởng bởi sql_mode của người dùng cài đặt.

Sự khác biệt

Sự khác biệt giữa hai chức năng này được nêu trong bảng sau.

Hàm Chế độ mặc định Chế độ Oracle
LENGTH() Trả về số byte. Trả về số ký tự.
LENGTHB() Trả về số byte. Trả về số byte.

Lưu ý rằng sự khác biệt này chỉ xuất hiện từ MariaDB 10.3.1. Trước đó, LENGTHB() không tồn tại và LENGTH() chỉ cần dịch sang OCTET_LENGTH() .

Ví dụ

Dưới đây là một ví dụ chứng minh sự khác biệt giữa LENGTH()LENGTHB() .

Hãy đặt phiên của chúng ta để sử dụng chế độ mặc định:

SET SESSION sql_mode=DEFAULT;

Phiên của tôi có thể đã ở chế độ mặc định, nhưng không có hại gì khi đặt nó một cách rõ ràng.

Bây giờ hãy chạy LENGTH()LENGTHB() với cùng một đối số:

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

Kết quả:

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

Vì vậy, khi ở chế độ mặc định, cả hai đều trả về cùng một giá trị.

Trong trường hợp này, cả hai đều trả về 5 , bởi vì có 5 byte trong chuỗi đó (é ký tự sử dụng 2 byte và tất cả các ký tự khác sử dụng mỗi byte 1).

Bây giờ chúng ta hãy chuyển sang chế độ Oracle:

SET SESSION sql_mode=ORACLE;

Bây giờ chúng ta hãy chạy lại câu lệnh trên:

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

Kết quả:

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

Lần này có sự khác biệt giữa hai chức năng. Lần này LENGTH() trả về 4 . Ít hơn 1 lần so với trước đây.

Điều này là do LENGTH() hoạt động khác nhau trong chế độ Oracle. Như đã đề cập, khi sql_mode=ORACLE , LENGTH() hàm dịch sang CHAR_LENGTH() , trả về số ký tự - không phải byte.

Trong ví dụ trước, LENGTH() đã trả về số byte vì khi sql_mode=DEFAULT , nó dịch thành 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. Cách HEX () hoạt động trong MariaDB

  2. Hướng dẫn về Chỉ mục MySQL

  3. Cách hoạt động của GREATEST () trong MariaDB

  4. Triển khai đa đám mây để nhân rộng MariaDB bằng WireGuard

  5. 4 cách để tách biệt giờ, phút và giây với một giá trị thời gian trong MariaDB