দুই ফাংশনই স্ট্রিং ফাংশন এবং স্ট্রিং-এ উপস্থিত ক্যারেক্টার সংখ্যা ফেরত দেয়। কিন্তু তারা এই ধারণায় ভিন্ন যে CHAR_LENGTH() ফাংশন স্ট্রিং দৈর্ঘ্য 'ক্যারেক্টার'-এ মাপে, অন্যদিকে LENGTH() ফাংশন স্ট্রিং দৈর্ঘ্য 'বাইট'-এ মাপে। অন্য কথায়, CHAR_LENGTH() ফাংশন মাল্টি-বাইট সেফ অর্থাৎ এটি উপেক্ষা করে যে ক্যারেক্টারগুলো একক-বাইট নাকি মাল্টি-বাইট। উদাহরণস্বরূপ, যদি একটি স্ট্রিং চারটি ২-বাইট ক্যারেক্টার ধারণ করে তবে LENGTH() ফাংশন ৮ ফেরত দেবে, কিন্তু CHAR_LENGTH() ফাংশন ৪ ফেরত দেবে। এই অর্থে, CHAR_LENGTH() LENGTH() ফাংশন চেয়ে বেশি নির্ভুল ফলাফল দেয়।
পার্থক্যটি বিশেষভাবে ইউনিকোডের জন্য প্রাসঙ্গিক, যেখানে অধিকাংশ ক্যারেক্টার দুই বাইটে এনকোডেড থাকে বা UTF-8-র জন্য যেখানে বাইটের সংখ্যা পরিবর্তনশীল। নিচের উদাহরণে এটি প্রদর্শন করা হলো −
উদাহরণ
নিচের উদাহরণে, প্রথমে 'Gaurav' স্ট্রিংকে ucs2 অর্থাৎ ইউনিকোড এবং ২-বাইট ক্যারেক্টার ধারণকারী ক্যারেক্টার সেটে রূপান্তর করা হয়েছে। তারপর রেজাল্ট সেট থেকে পার্থক্য দেখা যাচ্ছে অর্থাৎ 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)