Puncte:1

De ce MariaDB CHAR_LENGTH returnează NULL în loc de 0 când un câmp este NULL?

drapel gb
Tim

Încerc să calculez dimensiunea totală a metadatelor stocate într-un tabel folosind CHAR_LENGTH pentru a adăuga dimensiunea câmpurilor relevante din fiecare rând pentru a avea o idee aproximativă despre dimensiunea de stocare a unui set de rezultate.

Nu vreau dimensiunea tuturor datelor din tabel, ci doar dimensiunea unui set de rezultate.

Cu toate acestea, unele câmpuri din tabel au valori NULL și de îndată ce CHAR_LENGTH atinge una dintre acestea, întregul calcul eșuează deoarece CHAR_LENGTH returnează NULL și nu 0.

De exemplu:

SELECTAȚI SUM(dimensiunea rândului) ca `total` FROM ( SELECT CHAR_LENGTH(`câmp1`)+CHAR_LENGTH(`câmp2`)+CHAR_LENGTH(`câmp3`)+CHAR_LENGTH(`câmp4`) ca `dimensiune_rând` FROM `meta_date` WHERE `id ` = 1 AND `id2` = 2 ) ca tbl1;

Pentru unele interogări, acest lucru funcționează și obțin dimensiunea în octeți, dar pentru oricare care are o valoare NULL pe orice câmp din orice rând de rezultate, nu primesc nimic.

De ce CHAR_LENGTH nu ar returna 0 pentru o valoare NULL?

Presupun că cel mai bun lucru este să obțineți rezultatele înapoi și să le repetați în cod pentru a adăuga dimensiunea. Speram să evit să fac asta, dar ar putea fi singura cale?

drapel jp
Dom
https://mariadb.com/kb/en/char_length/ : „Dacă argumentul este NULL, returnează NULL.”. Deci, nu este un bug, este o caracteristică ;-). Încerc să rezolv problema cu SUM sau CONCAT, dar fără succes
drapel jp
Dom
SELECT CHAR_LENGTH(IFNULL(null, "")); functioneaza si returneaza 0 !
drapel jp
Dom
SELECTAȚI SUMA(dimensiunea_rândului) ca `total` FROM ( SELECT CHAR_LENGTH(IFNULL(`câmp1`, ''))+CHAR_LENGTH(IFNULL(`câmp2`, '')+CHAR_LENGTH(IFNULL(`câmp3`, ''))+ CHAR_LENGTH(IFNULL(`field4`, '')) ca `row_size` FROM `meta_data` WHERE `id` = 1 AND `id2` = 2 ) as tbl1;
djdomi avatar
drapel za
asta se datorează erorii serverului? nu este Stackfault da?! :-)
Michael Hampton avatar
drapel cz
Nu, acesta aparține pe [dba.se]
Puncte:1
drapel ua

Înconjoară fiecare cu COALESCE(..., 0).

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

mysql> SELECT COALESCE(CHAR_LENGTH(null), 0);
+--------------------------------+
| COALESCE(CHAR_LENGTH(null), 0) |
+--------------------------------+
| 0 |
+--------------------------------+

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

Fiți conștienți de faptul că există o supraîncărcare în orice șir -- poate o virgulă între ele, poate o nouă linie, poate altceva.

De asemenea, CHAR_LENGTH() dă o caracter numără, nu a octet numara.

drapel gb
Tim
Răspuns grozav. Mulțumesc.
Puncte:0
drapel cn

De ce CHAR_LENGTH nu ar returna 0 pentru o valoare NULL?

pentru că orice funcția (cu excepția NVL(), evident) va returna NULL dacă trece un argument NULL. Oficial:

f(NULL) == NULL

Mai important:

NULL != '' 

Un șir gol este .. ei bine .. un șir gol.
Un NULL marchează absenta de date.

Nu același lucru.
(Cu excepția cazului în care, desigur, încercați să utilizați date varchar într-o bază de date Oracle, care încă nu pot face diferenta, chiar în anii 2020).

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.