ทั้งสองฟังก์ชันเป็นฟังก์ชันสตริงและส่งคืนจำนวนอักขระที่มีอยู่ในสตริง แต่พวกเขาต่างกันในแนวคิดที่ว่าฟังก์ชัน CHAR_LENGTH() จะวัดความยาวของสตริงใน 'อักขระ' ในขณะที่ฟังก์ชัน LENGTH() จะวัดความยาวของสตริงเป็น 'ไบต์' กล่าวอีกนัยหนึ่ง เราสามารถพูดได้ว่าฟังก์ชัน CHAR_LENGTH() มีความปลอดภัยแบบหลายไบต์ กล่าวคือ ไม่สนใจว่าอักขระเป็นแบบไบต์เดียวหรือหลายไบต์ ตัวอย่างเช่น หากสตริงมีอักขระ 2 ไบต์สี่ตัว LENGTH()
ฟังก์ชันจะคืนค่า 8 ในขณะที่ฟังก์ชัน CHAR_LENGTH() จะคืนค่า 4 ในแง่นี้ เราสามารถพูดได้ว่า CHAR_LENGTH() ให้ผลลัพธ์ที่แม่นยำกว่าฟังก์ชัน LENGTH()
ความแตกต่างนี้มีความเกี่ยวข้องเป็นพิเศษกับ Unicode ซึ่งอักขระส่วนใหญ่เข้ารหัสเป็นสองไบต์หรือเกี่ยวข้องกับ UTF-8 โดยที่จำนวนไบต์แตกต่างกันไป ดังตัวอย่างด้านล่าง −
ตัวอย่าง
ในตัวอย่างนี้ อย่างแรกเลย สตริง "Gaurav" จะถูกแปลงเป็น ucs2 นั่นคือ Unicode และมีอักขระ 2 ไบต์ ชุดอักขระ จากนั้นเราสามารถสังเกตความแตกต่างจากชุดผลลัพธ์ เช่น LENGTH() ส่งคืนค่าความยาวเป็นจำนวนไบต์ และ CHAR_LENGTH() ส่งคืนค่าความยาวเป็นจำนวนอักขระ
mysql> SET @A = CONVERT('Gaurav' USING ucs2); Query OK, 0 rows affected (0.15 sec) mysql> Select Char_length(@A), LENGTH(@A); +-----------------+------------+ | Char_length(@A) | LENGTH(@A) | +-----------------+------------+ | 6 | 12 | +-----------------+------------+ 1 row in set (0.03 sec)
และในตัวอย่างด้านล่าง เรากำลังใช้อักขระพิเศษใน UTF-8 จำนวนไบต์แตกต่างกันไป ชุดอักขระ จากนั้นเราสามารถสังเกตความแตกต่างจากชุดผลลัพธ์ได้
mysql> SET @B = CONVERT('©' USING utf8); Query OK, 0 rows affected (0.15 sec) mysql> Select CHAR_LENGTH(@B); +-----------------------+ | CHAR_LENGTH(@B) | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec) mysql> Select LENGTH(@B); +---------------+ | LENGTH(@B) | +---------------+ | 2 | +---------------+ 1 row in set (0.00 sec)