MySQL의 LENGTH() 함수는 문자열의 길이를 바이트(byte) 단위로 측정합니다. 즉, 이 함수는 멀티바이트(multibyte)에 안전하지 않습니다. CHAR_LENGTH()나 CHARACTER_LENGTH()처럼 멀티바이트에 안전한 함수와 LENGTH() 함수의 결과 차이는 유니코드(Unicode) 환경에서 특히 중요합니다. 유니코드에서는 대부분의 문자가 2바이트로 인코딩되고, UTF-8에서는 문자마다 필요한 바이트 수가 달라지기 때문입니다.
예를 들어, 어떤 문자열이 2바이트짜리 문자 4개로 구성되어 있다면 LENGTH() 함수는 8을 반환하는 반면, CHAR_LENGTH() 또는 CHARACTER_LENGTH() 함수는 4를 반환합니다.
예제
먼저 일반 문자열에 대해 LENGTH() 함수를 실행해 보겠습니다.
mysql> Select LENGTH('tutorialspoint');
+--------------------------+
| LENGTH('tutorialspoint') |
+--------------------------+
| 14 |
+--------------------------+
1 row in set (0.00 sec)위 결과에서 알 수 있듯이 문자열 'tutorialspoint'의 길이는 14입니다. 이는 해당 문자열이 아직 유니코드 문자로 변환되지 않았기 때문입니다.
유니코드(ucs2)로 변환 후 비교
다음 쿼리는 이 문자열을 유니코드 문자로 변환합니다.
mysql> SET @A = CONVERT('tutorialspoint' USING ucs2);
Query OK, 0 rows affected (0.02 sec)문자열을 유니코드로 변환한 뒤 다시 LENGTH() 함수를 실행하면 결과가 14가 아닌 28이 됩니다. 유니코드에서는 한 문자가 2바이트를 차지하기 때문입니다.
mysql> Select LENGTH(@A); +------------+ | LENGTH(@A) | +------------+ | 28 | +------------+ 1 row in set (0.00 sec)
반면 멀티바이트에 안전한 함수인 CHAR_LENGTH()를 사용하면 아래와 같이 14라는 결과를 얻을 수 있습니다.
mysql> Select CHAR_LENGTH(@A); +-----------------+ | CHAR_LENGTH(@A) | +-----------------+ | 14 | +-----------------+ 1 row in set (0.00 sec)
정리
- LENGTH(): 문자열 길이를 바이트 단위로 반환하며, 멀티바이트 문자를 안전하게 처리하지 못함
- CHAR_LENGTH() / CHARACTER_LENGTH(): 문자 개수 기준으로 길이를 반환하며, 멀티바이트에 안전함
따라서 한글, 일본어, 중국어 등 멀티바이트 문자를 다루는 경우에는 실제 문자 수를 구하려면 CHAR_LENGTH() 함수를 사용하는 것이 좋습니다.