utf8mb4
데이터 정렬과 함께 문자 집합을 사용하는 것이 가장 좋습니다 utf8mb4_unicode_ci
.
문자 세트 utf8
는 가능한 문자의 약 6 % 인 소량의 UTF-8 코드 포인트 만 지원합니다. utf8
BMP (Basic Multilingual Plane) 만 지원합니다. 16 개의 다른 비행기가 있습니다. 각 비행기는 65,536 자입니다. utf8mb4
모든 17 비행기를 지원합니다.
MySQL은 4 바이트 UTF-8 문자를 자르고 데이터가 손상됩니다.
utf8mb4
문자 집합 2010-03-24에서 MySQL 5.5.3에서 소개되었습니다.
새 문자 집합을 사용하기 위해 필요한 일부 변경 사항은 간단하지 않습니다.
- 응용 프로그램 데이터베이스 어댑터에서 변경이 필요할 수 있습니다.
- 문자 집합 설정, 데이터 정렬 및 innodb_file_format in 바라쿠다로의 전환 등 my.cnf를 변경해야합니다.
- SQL CREATE 문에는 다음이 포함되어야합니다.
ROW_FORMAT=DYNAMIC
- DYNAMIC은 VARCHAR (192) 이상의 인덱스에 필요합니다.
참고 : 전환 Barracuda
에서 Antelope
, 두 번 이상 MySQL의 서비스를 다시 시작해야 할 수 있습니다. innodb_file_format_max
MySQL 서비스가 다음으로 다시 시작될 때까지 변경되지 않습니다 innodb_file_format = barracuda
.
MySQL은 이전 Antelope
InnoDB 파일 형식을 사용 합니다. Barracuda
문자 세트로 전환 한 후 인덱스 및 키를 작성하기 위해 SQL 오류를 발생시키지 않으려는 경우 필요한 동적 행 형식을 지원합니다.utf8mb4
- # 1709-색인 열 크기가 너무 큽니다. 최대 열 크기는 767 바이트입니다.
- # 1071-지정된 키가 너무 깁니다. 최대 키 길이는 767 바이트입니다.
다음 시나리오는 MySQL 5.6.17에서 테스트되었습니다. 기본적으로 MySQL은 다음과 같이 구성됩니다.
SHOW VARIABLES;
innodb_large_prefix = OFF
innodb_file_format = Antelope
MySQL 서비스를 중지하고 기존 my.cnf에 옵션을 추가하십시오.
[client]
default-character-set= utf8mb4
[mysqld]
explicit_defaults_for_timestamp = true
innodb_large_prefix = true
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_file_per_table = true
# Character collation
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
SQL CREATE 문 예제 :
CREATE TABLE Contacts (
id INT AUTO_INCREMENT NOT NULL,
ownerId INT DEFAULT NULL,
created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
contact VARCHAR(640) NOT NULL,
prefix VARCHAR(128) NOT NULL,
first VARCHAR(128) NOT NULL,
middle VARCHAR(128) NOT NULL,
last VARCHAR(128) NOT NULL,
suffix VARCHAR(128) NOT NULL,
notes MEDIUMTEXT NOT NULL,
INDEX IDX_CA367725E05EFD25 (ownerId),
INDEX created (created),
INDEX modified_idx (modified),
INDEX contact_idx (contact),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT=DYNAMIC;
- CREATE 문에서
INDEX contact_idx (contact)
if ROW_FORMAT=DYNAMIC
가 제거 되면 오류 # 1709가 생성 됩니다.
참고 : 색인을 처음 128 자로 제한하면 contact
바라쿠다를 사용할 필요가 없습니다.ROW_FORMAT=DYNAMIC
INDEX contact_idx (contact(128)),
참고 : 필드의 크기가이라고 말하면 VARCHAR(128)
128 바이트가 아닙니다. 128, 4 바이트 문자 또는 128, 1 바이트 문자를 사용할 수 있습니다.
이 INSERT
명령문은 2 행에 4 바이트 'poo'문자를 포함해야합니다.
INSERT INTO `Contacts` (`id`, `ownerId`, `created`, `modified`, `contact`, `prefix`, `first`, `middle`, `last`, `suffix`, `notes`) VALUES
(1, NULL, '0000-00-00 00:00:00', '2014-08-25 03:00:36', '1234567890', '12345678901234567890', '1234567890123456789012345678901234567890', '1234567890123456789012345678901234567890', '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678', '', ''),
(2, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '', ''),
(3, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '123💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '', '');
last
열에서 사용 된 공간의 양을 볼 수 있습니다 .
mysql> SELECT BIT_LENGTH(`last`), CHAR_LENGTH(`last`) FROM `Contacts`;
+--------------------+---------------------+
| BIT_LENGTH(`last`) | CHAR_LENGTH(`last`) |
+--------------------+---------------------+
| 1024 | 128 | -- All characters are ASCII
| 4096 | 128 | -- All characters are 4 bytes
| 4024 | 128 | -- 3 characters are ASCII, 125 are 4 bytes
+--------------------+---------------------+
데이터베이스 어댑터에서 연결에 대한 문자 세트 및 데이터 정렬을 설정할 수 있습니다.
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'
PHP에서는 다음과 같이 설정됩니다. \PDO::MYSQL_ATTR_INIT_COMMAND
참고 문헌 :