Trong MariaDB, WEIGHT_STRING()
là một hàm dựng sẵn trả về chuỗi trọng số cho chuỗi đầu vào. Giá trị trả về là một chuỗi nhị phân đại diện cho giá trị so sánh và sắp xếp của chuỗi.
Nếu chuỗi đầu vào là giá trị không nhị phân, giá trị trả về chứa trọng số đối chiếu của chuỗi. Nếu đó là giá trị nhị phân, kết quả sẽ giống với chuỗi đầu vào. Điều này là do trọng số của mỗi byte trong chuỗi nhị phân là giá trị byte.
Chức năng này là một chức năng gỡ lỗi nhằm mục đích sử dụng nội bộ. Nó có thể được sử dụng để kiểm tra và gỡ lỗi các ảnh ghép.
Cú pháp
Cú pháp như sau:
WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ...
Dưới đây là mô tả của từng đối số / mệnh đề.
AS
Mệnh đề
AS
tùy chọn mệnh đề cho phép truyền chuỗi đầu vào thành một chuỗi nhị phân hoặc không phải nhị phân, cũng như một độ dài cụ thể.
-
AS BINARY(N)
đo độ dài theo byte chứ không phải ký tự và các miếng đệm bên phải có độ dài mong muốn là 0x00 byte. -
AS CHAR(N)
đo độ dài bằng ký tự và các miếng đệm bên phải có khoảng cách với độ dài mong muốn.
N
có giá trị tối thiểu là 1
và nếu nó nhỏ hơn độ dài của chuỗi đầu vào, thì chuỗi đó sẽ bị cắt ngắn mà không có cảnh báo.
LEVEL
Mệnh đề
Chỉ định rằng giá trị trả về phải chứa các trọng số cho các mức đối chiếu cụ thể.
Các levels
mã xác định có thể là một số nguyên duy nhất, một danh sách các số nguyên được phân tách bằng dấu phẩy hoặc một dải các số nguyên được phân tách bằng dấu gạch ngang (khoảng trắng bị bỏ qua). Các số nguyên có thể nằm trong khoảng từ 1
tối đa là 6
, phụ thuộc vào đối chiếu và cần được liệt kê theo thứ tự tăng dần.
- Nếu
LEVEL
mệnh đề không được cung cấp, mặc định là1
tối đa cho sự đối chiếu được giả định. - Nếu
LEVEL
được chỉ định mà không sử dụng dải ô, công cụ sửa đổi tùy chọn được phép. -
ASC
(mặc định) trả về trọng số mà không có bất kỳ sửa đổi nào. -
DESC
trả về trọng số ngược chiều bit. -
REVERSE
trả về các trọng số theo thứ tự ngược lại.
Ví dụ
Đây là một ví dụ cơ bản:
SELECT HEX(WEIGHT_STRING('z'));
Kết quả:
+-------------------------+ | HEX(WEIGHT_STRING('z')) | +-------------------------+ | 005A | +-------------------------+
Ở đây, chúng tôi sử dụng HEX()
hàm đại diện cho các kết quả không in được ở định dạng thập lục phân.
AS
Mệnh đề
Đây là một ví dụ sử dụng AS
mệnh đề để truyền chuỗi đầu vào thành một kiểu và độ dài nhất định.
SET @str = 'z';
SELECT
HEX(WEIGHT_STRING(@str AS CHAR(3))) 'Char 3',
HEX(WEIGHT_STRING(@str AS CHAR(8))) 'Char 8',
HEX(WEIGHT_STRING(@str AS BINARY(3))) 'Binary 3',
HEX(WEIGHT_STRING(@str AS BINARY(8))) 'Binary 8';
Kết quả (sử dụng đầu ra dọc):
Char 3: 005A00200020 Char 8: 005A0020002000200020002000200020 Binary 3: 7A0000 Binary 8: 7A00000000000000
Đối chiếu
Hai ví dụ sau đây chứng minh cách một chuỗi có thể có một chuỗi trọng số khác nhau, tùy thuộc vào đối chiếu đang được sử dụng.
Đối chiếu được sử dụng trong ví dụ đầu tiên là không phân biệt chữ hoa chữ thường. Đối chiếu được sử dụng trong ví dụ thứ hai là phân biệt chữ hoa chữ thường.
SET @upper = _latin1 'PLAY' COLLATE latin1_general_ci;
SET @lower = lcase(@upper);
SELECT
@upper 'String',
HEX(@upper) 'Hex',
HEX(WEIGHT_STRING(@upper)) 'Weight String'
UNION ALL
SELECT
@lower,
HEX(@lower),
HEX(WEIGHT_STRING(@lower));
Kết quả:
+--------+----------+---------------+ | String | Hex | Weight String | +--------+----------+---------------+ | PLAY | 504C4159 | 8F7941AA | | play | 706C6179 | 8F7941AA | +--------+----------+---------------+
Và đây là ví dụ tương tự, ngoại trừ đối chiếu phân biệt chữ hoa chữ thường.
SET @upper = _latin1 'PLAY' COLLATE latin1_general_cs;
SET @lower = lcase(@upper);
SELECT
@upper 'String',
HEX(@upper) 'Hex',
HEX(WEIGHT_STRING(@upper)) 'Weight String'
UNION ALL
SELECT
@lower,
HEX(@lower),
HEX(WEIGHT_STRING(@lower));
Kết quả:
+--------+----------+---------------+ | String | Hex | Weight String | +--------+----------+---------------+ | PLAY | 504C4159 | 8F7941AA | | play | 706C6179 | 907A42AB | +--------+----------+---------------+
Đối số rỗng
Chuyển null
trả về null
:
SELECT WEIGHT_STRING(null);
Kết quả:
+---------------------+ | WEIGHT_STRING(null) | +---------------------+ | NULL | +---------------------+
Thiếu đối số
Đang gọi WEIGHT_STRING()
với số lượng đối số sai hoặc không chuyển bất kỳ đối số nào dẫn đến lỗi:
SELECT WEIGHT_STRING();
Kết quả:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1