MySQL-길이 () vs char_length ()


215

사이의 주요 차이점은 무엇 length()char_length()?

이진 및 이진이 아닌 문자열과 관련이 있다고 생각합니다. 문자열을 이진으로 저장해야하는 실질적인 이유가 있습니까?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
예, 이진 문자열이 실제로 이진 문자열 인 경우 (예 : 압축) 이진 문자열을 저장해야하는 실질적인 이유가 있습니다.
sanmai

답변:


351

LENGTH()바이트 단위로 측정문자열 의 길이를 반환합니다 . 문자로 측정 된 문자열
CHAR_LENGTH() 의 길이를 반환합니다 .

이것은 대부분의 문자가 2 바이트로 인코딩되는 유니 코드와 관련이 있습니다. 또는 바이트 수가 다른 UTF-8. 예를 들면 다음과 같습니다.

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

보시다시피 유로 부호는 0xE282AC하나의 문자 일지라도 3 바이트 ( UTF-8 로 인코딩 됨) 를 차지 합니다.


6
문자 당 2 바이트로 UCS-2 만 인코딩됩니다. 이 인코딩 (또는보다 정확하게 UTF-16LE)은 Windows에서 "유니 코드"를 잘못 부르는 것입니다. MySQL은 UTF-16을 지원하지 않습니다. 대신 유니 코드 문자열을 넣는 일반적인 방법은 UTF-8을 사용하는 것입니다.
bobince

2
예 : select length ( '日本語'), char_length ( '日本語');
sanmai

@bobince : UCS-2에서도 일부 문자를 2 바이트 이상으로 인코딩합니다 (예 :) 0313 combining comma above. a = 61이므로 0x00610313은 a̓로 표시되며 4 바이트를 차지합니다.
Andomar

2
실제로 유니 코드 용어로는 2 글자이지만, 모든 결합 표시와 마찬가지로 (적절한 글꼴을 사용할 수있는 경우) 단일 글리프로 렌더링 할 수 있습니다. UTF-16LE는 대리자 덕분에 여전히 4 바이트 문자를 가질 수 있습니다.
bobince

6
VARCHAR 열의 크기를 조정하는 방법을 알아낼 때 어떤 함수를 사용해야합니까? 테이블을 만들 때 하나의 열이 VARCHAR (10)이라고 말합니다. 최대 10 자 또는 최대 10 바이트를 허용합니까?
still_dreaming_1

19

varchar (10)은 10자를 초과 할 수있는 10자를 저장합니다. 인덱스에서는 필드의 최대 길이를 할당하므로 UTF8-mb4를 사용하는 경우 10 자 필드에 40 바이트를 할당합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.