MySQL의 LENGTH()와 CHAR_LENGTH()는 모두 문자열 함수로, 문자열에 포함된 길이를 반환한다는 공통점이 있습니다. 하지만 두 함수는 길이를 측정하는 방식에서 중요한 차이를 보입니다. CHAR_LENGTH() 함수는 문자열 길이를 '문자(character)' 단위로 측정하는 반면, LENGTH() 함수는 '바이트(byte)' 단위로 측정합니다.
즉, CHAR_LENGTH() 함수는 멀티바이트 안전(multi-byte safe)하기 때문에 해당 문자가 싱글바이트인지 멀티바이트인지 여부와 관계없이 문자 수를 그대로 계산합니다. 예를 들어, 어떤 문자열이 2바이트 문자 4개로 구성되어 있다면 LENGTH() 함수는 8을 반환하지만, CHAR_LENGTH() 함수는 4를 반환합니다. 이러한 의미에서 CHAR_LENGTH() 함수가 LENGTH() 함수보다 더 정확한 결과를 제공한다고 할 수 있습니다.
이 차이는 대부분의 문자가 2바이트로 인코딩되는 유니코드(Unicode), 그리고 문자마다 바이트 수가 달라지는 UTF-8 환경에서 특히 중요합니다. 아래 예제를 통해 직접 확인해 보겠습니다.
예제 1: ucs2(유니코드) 문자셋 사용
아래 예제에서는 먼저 문자열 'Gaurav'를 ucs2, 즉 모든 문자를 2바이트로 저장하는 유니코드 문자셋으로 변환합니다. 결과 집합에서 알 수 있듯이 LENGTH()는 바이트 수 기준으로 12를, CHAR_LENGTH()는 문자 수 기준으로 6을 반환합니다.
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)예제 2: UTF-8 문자셋에서 특수 문자 사용
다음 예제에서는 UTF-8 문자셋에서 특수 문자 '©'를 사용합니다. UTF-8은 문자에 따라 바이트 수가 달라지는 문자셋이므로, 두 함수의 반환값 차이를 뚜렷하게 확인할 수 있습니다. CHAR_LENGTH()는 문자 개수인 1을 반환하고, LENGTH()는 실제 바이트 수인 2를 반환합니다.
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)정리
두 함수의 핵심 차이를 요약하면 다음과 같습니다.
- LENGTH(): 문자열의 바이트 수를 반환 → 멀티바이트 문자에서는 실제 문자 수보다 큰 값이 나올 수 있음
- CHAR_LENGTH(): 문자열의 문자 수를 반환 → 멀티바이트 안전하며 한글, 유니코드 등에 적합
따라서 한글이나 이모지처럼 멀티바이트 문자가 포함될 가능성이 있는 데이터를 다룰 때는 CHAR_LENGTH()를 사용하는 것이 더 정확한 길이 정보를 얻는 방법입니다.