[mysql] MySQL VARCHAR 길이 및 UTF-8

MySQL VARCHAR(32)에서 UTF-8 테이블에 새 필드를 만들면 해당 필드에 32 바이트의 데이터를 저장할 수 있는지 아니면 32 자 (멀티 바이트)를 저장할 수 있습니까?



답변

이 답변은 내 Google 검색 결과 상단에 표시되었지만 정확하지 않았습니다.

혼란은 아마도 다른 버전의 mysql이 테스트되기 때문일 것입니다.

  • 버전 4는 바이트를 계산합니다.
  • 버전 5는 문자를 계산합니다.

http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

MySQL은 문자 열 정의의 길이 사양을 문자 단위로 해석합니다. (MySQL 4.1 이전에는 열 길이가 바이트로 해석되었습니다.) 이는 CHAR, VARCHAR 및 TEXT 유형에 적용됩니다.

흥미롭게도 (나는 그것에 대해 생각하지 않았다) varchar 열의 최대 길이는 다음과 같이 utf8의 영향을받습니다.

MySQL 5.0.3 이상에서 VARCHAR의 유효 최대 길이는 최대 행 크기 (65,535 바이트, 모든 열에서 공유 됨) 및 사용 된 문자 집합의 영향을받습니다. 예를 들어, utf8 문자는 문자 당 최대 3 바이트를 요구할 수 있으므로 utf8 문자 세트를 사용하는 VARCHAR 열은 최대 21,844 자로 선언 될 수 있습니다.


답변

32 개의 멀티 바이트 문자를 저장할 수 있습니다.

UTF-8로 공간을 절약하려면 CHAR 대신 VARCHAR을 사용하십시오. 그렇지 않으면 MySQL은 가능한 최대 길이이므로 CHAR CHARACTER SET utf8 열의 각 문자에 대해 3 바이트를 예약해야합니다. 예를 들어 MySQL은 CHAR (10) CHARACTER SET utf8 열에 대해 30 바이트를 예약해야합니다.

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html


답변

collation과 함께 32 멀티 바이트 데이터 , 방금 XAMPP로 테스트했습니다.varchar(32)utf8_unicode_ci

1234567890123456789012345678901234567890

다음으로 잘립니다.

12345678901234567890123456789012

이들은 일반 ASCII 문자가 아님을 명심하십시오.


답변

행의 총 데이터 길이가 고정되고 빠르기 때문에 자주 업데이트되는 테이블에는 “char”를 사용하는 것이 좋습니다. Varchar 열은 행 데이터 크기를 동적으로 만듭니다. 그것은 MyISAM에 좋지 않지만 InnoDB와 다른 사람들에 대해서는 모릅니다. 예를 들어, 매우 좁은 “유형”열이있는 경우 최소 공간 만 요구하려면 latin1 문자 집합과 함께 char (2)를 사용하는 것이 좋습니다.


답변

latin1 인코딩 (예 : PHP 사용)을 사용하여 데이터베이스에 연결하여 MySQL UTF8 열에 PHP UTF8 문자열을 저장하면 이중 UTF8 인코딩이됩니다.

UTF8 문자열의 $s길이가 32 자이지만 길이가 64 바이트이고 열이 VARCHAR(32)UTF8 인 경우 이중 인코딩은 문자열 $s을 64 자 길이의 UTF8 문자열 로 변환 하여 데이터베이스에서 잘리는 첫 번째 32 바이트에 해당하는 32 자 문자열로 변환합니다. / $s. MySQL 5가 MySQL 4처럼 작동한다고 생각할 수도 있지만 실제로는 동일한 효과의 두 번째 원인입니다.


답변