Score:1

เหตุใด MariaDB CHAR_LENGTH จึงส่งคืน NULL แทนที่จะเป็น 0 เมื่อฟิลด์เป็น NULL

ธง gb
Tim

ฉันกำลังพยายามคำนวณขนาดรวมของข้อมูลเมตาที่จัดเก็บไว้ในตารางโดยใช้ CHAR_LENGTH เพื่อเพิ่มขนาดของฟิลด์ที่เกี่ยวข้องในแต่ละแถวเพื่อให้ได้แนวคิดคร่าวๆ เกี่ยวกับขนาดที่เก็บข้อมูลของชุดผลลัพธ์

ฉันไม่ต้องการขนาดของข้อมูลทั้งหมดในตาราง ต้องการขนาดของชุดผลลัพธ์เท่านั้น

อย่างไรก็ตาม บางฟิลด์ในตารางมีค่าเป็น NULL และทันทีที่ CHAR_LENGTH ถึงหนึ่งในนั้น การคำนวณทั้งหมดจะล้มเหลว เนื่องจาก CHAR_LENGTH ส่งคืนค่า NULL ไม่ใช่ 0

ตัวอย่างเช่น:

SELECT SUM(row_size) as `total` FROM ( SELECT CHAR_LENGTH(`field1`)+CHAR_LENGTH(`field2`)+CHAR_LENGTH(`field3`)+CHAR_LENGTH(`field4`) as `row_size` FROM `meta_data` WHERE `id ` = 1 และ `id2` = 2 ) เป็น tbl1;

สำหรับข้อความค้นหาบางอย่างใช้งานได้และฉันได้รับขนาดเป็นไบต์ แต่สำหรับค่า NULL ใด ๆ ในฟิลด์ใด ๆ ในแถวของผลลัพธ์ฉันไม่ได้รับอะไรเลย

เหตุใด CHAR_LENGTH จึงไม่คืนค่า 0 เป็นค่า NULL

ฉันคิดว่าสิ่งที่ดีที่สุดถัดไปคือการได้รับผลลัพธ์กลับมาและวนซ้ำในโค้ดเพื่อเพิ่มขนาด ฉันหวังว่าจะหลีกเลี่ยงการทำเช่นนั้น แต่มันอาจจะเป็นวิธีเดียว?

jp flag
Dom
https://mariadb.com/kb/en/char_length/ : "หากอาร์กิวเมนต์เป็น NULL จะคืนค่า NULL" ดังนั้นจึงไม่ใช่ข้อบกพร่อง แต่เป็นคุณลักษณะ ;-) ฉันพยายามแก้ปัญหาด้วย SUM หรือ CONCAT แต่ไม่มีโชค
jp flag
Dom
เลือก CHAR_LENGTH(IFNULL(null, "")); ทำงานและส่งคืน 0 !
jp flag
Dom
เลือก SUM(row_size) เป็น `total` FROM ( SELECT CHAR_LENGTH(IFNULL(`field1`, ''))+CHAR_LENGTH(IFNULL(`field2`, '')+CHAR_LENGTH(IFNULL(`field3`, ''))+ CHAR_LENGTH(IFNULL(`field4`, '')) เป็น `row_size` FROM `meta_data` โดยที่ `id` = 1 และ `id2` = 2 ) เป็น tbl1;
djdomi avatar
za flag
นั่นเป็นความผิดของเซิร์ฟเวอร์จริงหรือ ไม่ มันคือ Stackfault ใช่ไหม! :-)
Michael Hampton avatar
cz flag
ไม่ นี่เป็นของ [dba.se]
Score:1
ธง ua

รายล้อมไปด้วย โคเลสเซ่(..., 0).

mysql> เลือก CHAR_LENGTH(null), CHAR_LENGTH(''), CHAR_LENGTH('abc');
+----------------------+----------------+------ ---------+
| CHAR_LENGTH(null) | CHAR_LENGTH('') | CHAR_LENGTH('abc') |
+----------------------+----------------+------ ---------+
| โมฆะ | 0 | 3 |
+----------------------+----------------+------ ---------+

mysql> เลือก COALESCE(CHAR_LENGTH(null), 0);
++--------------------------------
| COALESCE(CHAR_LENGTH(null), 0) |
++--------------------------------
| 0 |
++--------------------------------

mysql> เลือกความยาว ('') เป็น len, CHAR_LENGTH ('') เป็น char_len;
+-----+----------+
| เลน | char_len |
+-----+----------+
| 16 | 4 |
+-----+----------+

โปรดทราบว่ามีค่าใช้จ่ายในสตริงใดๆ -- อาจเป็นเครื่องหมายจุลภาคระหว่างพวกเขา อาจขึ้นบรรทัดใหม่ หรืออาจเป็นอย่างอื่น

อีกด้วย, CHAR_LENGTH() ให้ อักขระ นับ ไม่ใช่ ก ไบต์ นับ.

gb flag
Tim
คำตอบที่ดี ขอขอบคุณ.
Score:0
ธง cn

เหตุใด CHAR_LENGTH จึงไม่คืนค่า 0 เป็นค่า NULL

เพราะ ใดๆ ฟังก์ชัน (ยกเว้นการชอบของ NVL() แน่นอน) จะคืนค่า NULL หากผ่านอาร์กิวเมนต์ NULL อย่างเป็นทางการ:

f(โมฆะ) == โมฆะ

ที่สำคัญกว่า:

โมฆะ != '' 

สตริงว่างคือ .. อืม .. สตริงว่าง
NULL ทำเครื่องหมาย ขาด ของข้อมูล

ไม่ใช่สิ่งเดียวกัน
(เว้นแต่ว่าคุณกำลังพยายามใช้ข้อมูล varchar ใน Oracle Database ซึ่ง นิ่ง ไม่สามารถบอกความแตกต่าง สม่ำเสมอ ในปี 2563)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา