MySQL VARCHAR(32)
에서 UTF-8 테이블에 새 필드를 만들면 해당 필드에 32 바이트의 데이터를 저장할 수 있는지 아니면 32 자 (멀티 바이트)를 저장할 수 있습니까?
MySQL VARCHAR(32)
에서 UTF-8 테이블에 새 필드를 만들면 해당 필드에 32 바이트의 데이터를 저장할 수 있는지 아니면 32 자 (멀티 바이트)를 저장할 수 있습니까?
답변:
이 답변은 내 Google 검색 결과 상단에 표시되었지만 정확하지 않았습니다.
혼란은 아마도 다른 버전의 mysql이 테스트되기 때문일 것입니다.
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 자로 선언 될 수 있습니다.
utf8mb4
)는 "💩💩💩💩💩💩💩💩💩💩"(10 개의 똥 더미)를 저장할 수 있습니다. 즉, 10 자이지만 40 바이트입니다.
32 개의 멀티 바이트 문자를 저장할 수 있습니다.
UTF-8로 공간을 절약하려면 CHAR 대신 VARCHAR을 사용하십시오. 그렇지 않으면 MySQL은 가능한 최대 길이이므로 CHAR CHARACTER SET utf8 열의 각 문자에 대해 3 바이트를 예약해야합니다. 예를 들어 MySQL은 CHAR (10) CHARACTER SET utf8 열에 대해 30 바이트를 예약해야합니다.
CHAR
할 때 멀티 바이트 문자를 저장하는 것이 아니므로 안전합니다. 무엇에 대해 VARCHAR
, 반드시 제한이 단일 바이트 문자에 멀티 바이트 문자에 정의되지 않고있어?
collation과 함께 32 멀티 바이트 데이터 , 방금 XAMPP로 테스트했습니다.varchar(32)
utf8_unicode_ci
1234567890123456789012345678901234567890
다음으로 잘립니다.
12345678901234567890123456789012
이들은 일반 ASCII 문자가 아님을 명심하십시오.
utf8
하면 MySQL에서 유니 코드 지원이 중단됩니다. utf8mb4
대신 인코딩을 사용해야합니다 . MySQL의 utf8 변형에서와 같이 3이 아닌 utf-8 char에서 4 바이트 ...
행의 총 데이터 길이가 고정되고 빠르기 때문에 자주 업데이트되는 테이블에는 "char"를 사용하는 것이 좋습니다. Varchar 열은 행 데이터 크기를 동적으로 만듭니다. 그것은 MyISAM에 좋지 않지만 InnoDB와 다른 사람들에 대해서는 모릅니다. 예를 들어, 매우 좁은 "유형"열이있는 경우 최소 공간 만 요구하려면 latin1 문자 집합과 함께 char (2)를 사용하는 것이 좋습니다.
CHAR
. InnoDB의 경우, "동적 / 고정 된 행 크기"논쟁이 본질적으로 관련이 없을 정도로 많은 다른 일이 진행되고 있습니다.
CHAR
.
latin1 인코딩 (예 : PHP 사용)을 사용하여 데이터베이스에 연결하여 MySQL UTF8 열에 PHP UTF8 문자열을 저장하면 이중 UTF8 인코딩이됩니다.
UTF8 문자열의 $s
길이가 32 자이지만 길이가 64 바이트이고 열이 VARCHAR(32)
UTF8 인 경우 이중 인코딩은 문자열 $s
을 64 자 길이의 UTF8 문자열 로 변환 하여 데이터베이스에서 잘리는 첫 번째 32 바이트에 해당하는 32 자 문자열로 변환합니다. / $s
. MySQL 5가 MySQL 4처럼 작동한다고 생각할 수도 있지만 실제로는 동일한 효과의 두 번째 원인입니다.