MySQL의 BIT_LENGTH() 함수는 LENGTH() 함수와 마찬가지로 멀티바이트 안전(multi-byte safe)하지 않습니다. 즉, 문자열에 포함된 문자의 개수가 아니라 실제 저장된 비트 수를 그대로 반환하기 때문에, 문자셋에 따라 결과값이 달라질 수 있습니다.
CHAR_LENGTH()나 CHARACTER_LENGTH()처럼 멀티바이트를 안전하게 처리하는 함수와 BIT_LENGTH() 함수의 결과 차이는, 대부분의 문자가 2바이트로 인코딩되는 유니코드(Unicode) 환경이나 문자마다 바이트 수가 달라지는 UTF-8 환경에서 특히 두드러집니다. 아래 예시를 통해 이를 직접 확인해 보겠습니다.
예제 1: 일반 문자열에 BIT_LENGTH() 적용
mysql> Select BIT_LENGTH('tutorialspoint');
+------------------------------+
| BIT_LENGTH('tutorialspoint') |
+------------------------------+
| 112 |
+------------------------------+
1 row in set (0.00 sec)위 결과에서 문자열 'tutorialspoint'의 비트 길이는 112입니다. 이 문자열은 아직 유니코드로 변환되지 않은 상태이며, 총 14개의 문자가 각각 1바이트(8비트)로 처리되어 14 × 8 = 112비트가 된 것입니다.
예제 2: 유니코드(ucs2)로 변환 후 BIT_LENGTH() 적용
이제 다음 쿼리를 사용해 해당 문자열을 유니코드 문자셋으로 변환해 보겠습니다.
mysql> SET @A = CONVERT('tutorialspoint' USING ucs2);
Query OK, 0 rows affected (0.02 sec)문자열을 유니코드로 변환한 뒤 다시 비트 길이를 조회하면, 결과가 112가 아닌 224로 반환됩니다.
mysql> Select BIT_LENGTH(@A); +----------------+ | BIT_LENGTH(@A) | +----------------+ | 224 | +----------------+ 1 row in set (0.00 sec)
그 이유는 유니코드(ucs2)에서는 하나의 문자가 2바이트(16비트)를 차지하기 때문입니다. 따라서 14개의 문자 × 16비트 = 224비트가 되는 것입니다.
정리
BIT_LENGTH()는 문자열의 비트(bit) 단위 길이를 반환하며, 문자셋의 영향을 그대로 받습니다.- 멀티바이트 안전성이 필요하다면
CHAR_LENGTH()또는CHARACTER_LENGTH()를 사용하는 것이 좋습니다. - 유니코드나 UTF-8처럼 문자당 바이트 수가 다른 문자셋을 다룰 때는
BIT_LENGTH()와LENGTH()의 결과를 주의 깊게 해석해야 합니다.