Điểm:1

Tại sao MariaDB CHAR_LENGTH trả về NULL thay vì 0 khi một trường là NULL?

lá cờ gb
Tim

Tôi đang cố gắng tính tổng kích thước của siêu dữ liệu được lưu trữ trong một bảng bằng cách sử dụng CHAR_LENGTH để cộng kích thước của các trường có liên quan trong mỗi hàng để có ý tưởng sơ bộ về kích thước lưu trữ của tập hợp kết quả.

Tôi không muốn kích thước của tất cả dữ liệu trong bảng, chỉ kích thước của một tập hợp kết quả.

Tuy nhiên, một số trường trong bảng có giá trị NULL và ngay khi CHAR_LENGTH chạm vào một trong các giá trị đó thì toàn bộ phép tính không thành công vì CHAR_LENGTH trả về NULL chứ không phải 0.

Ví dụ:

CHỌN SUM(row_size) làm `total` TỪ ( SELECT CHAR_LENGTH(`field1`)+CHAR_LENGTH(`field2`)+CHAR_LENGTH(`field3`)+CHAR_LENGTH(`field4`) làm `row_size` TỪ `meta_data` WHERE `id ` = 1 AND `id2` = 2 ) dưới dạng tbl1;

Đối với một số truy vấn, điều này hoạt động và tôi nhận được kích thước tính bằng byte nhưng đối với bất kỳ truy vấn nào có giá trị NULL trên bất kỳ trường nào trong bất kỳ hàng nào của kết quả, tôi không nhận được gì.

Tại sao CHAR_LENGTH không trả về 0 cho giá trị NULL?

Tôi cho rằng điều tốt nhất tiếp theo là lấy lại kết quả và lặp lại chúng trong mã để tăng kích thước. Tôi đã hy vọng tránh làm điều đó nhưng nó có thể là cách duy nhất?

lá cờ jp
Dom
https://mariadb.com/kb/en/char_length/ : "Nếu đối số là NULL, nó sẽ trả về NULL.". Vì vậy, nó không phải là một lỗi, nó là một tính năng ;-). Tôi cố gắng giải quyết vấn đề bằng SUM hoặc CONCAT, nhưng không gặp may
lá cờ jp
Dom
CHỌN CHAR_LENGTH(IFNULL(null, "")); hoạt động và trả về 0!
lá cờ jp
Dom
CHỌN SUM(row_size) là `tổng` TỪ ( SELECT CHAR_LENGTH(IFNULL(`field1`, ''))+CHAR_LENGTH(IFNULL(`field2`, '')+CHAR_LENGTH(IFNULL(`field3`, ''))+ CHAR_LENGTH(IFNULL(`field4`, '')) dưới dạng `row_size` TỪ `meta_data` WHERE `id` = 1 AND `id2` = 2 ) dưới dạng tbl1;
djdomi avatar
lá cờ za
đó có phải là lỗi của máy chủ không? không phải là Stackfault đúng không?! :-)
Michael Hampton avatar
lá cờ cz
Không, cái này thuộc về [dba.se]
Điểm:1
lá cờ ua

Bao quanh mỗi với HỢP NHẤT(..., 0).

mysql> CHỌN CHAR_LENGTH(null), CHAR_LENGTH(''), CHAR_LENGTH('abc');
+--------------------+-----------------+------------ ---------+
| CHAR_LENGTH(null) | CHAR_LENGTH('') | CHAR_LENGTH('abc') |
+--------------------+-----------------+------------ ---------+
| NULL | 0 | 3 |
+--------------------+-----------------+------------ ---------+

mysql> CHỌN COALESCE(CHAR_LENGTH(null), 0);
++-------------------------------- +
| KẾT HỢP(CHAR_LENGTH(null), 0) |
++-------------------------------- +
| 0 |
++-------------------------------- +

mysql> CHỌN LENGTH('') AS len, CHAR_LENGTH('') AS char_len;
+------+----------+
| len | char_len |
+------+----------+
| 16 | 4 |
+------+----------+

Xin lưu ý rằng có phí trong bất kỳ chuỗi nào -- có thể là dấu phẩy giữa chúng, có thể là một dòng mới, có thể là một thứ gì đó khác.

Cũng thế, CHAR_LENGTH() đưa ra một nhân vật đếm, không phải là một byte đếm.

lá cờ gb
Tim
Câu trả lời chính xác. Cảm ơn bạn.
Điểm:0
lá cờ cn

Tại sao CHAR_LENGTH không trả về 0 cho giá trị NULL?

Bởi vì không tí nào chức năng (ngoại trừ các chức năng như NVL(), rõ ràng) sẽ trả về NULL nếu thông qua một đối số NULL. chính thức:

f(NULL) == NULL

Quan trọng hơn:

NULL != '' 

Một chuỗi rỗng là .. à .. một chuỗi rỗng.
NULL đánh dấu vắng mặt Dữ liệu.

Không giống nhau.
(Tất nhiên, trừ khi bạn đang cố gắng sử dụng dữ liệu varchar trong Cơ sở dữ liệu Oracle, vẫn không thể nói sự khác biệt, thậm chí trong những năm 2020).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.