MySQL 5.5.21을 사용 중이며 '\ xF0 \ x9F \ x98 \ x8A'웃는 얼굴 문자를 삽입하려고합니다. 그러나 내 인생에서 나는 그것을하는 방법을 알 수 없습니다.
내가 읽은 다양한 포럼에 따르면 가능합니다. 그러나 그것을 시도 할 때마다 데이터가 잘립니다.
mysql> INSERT INTO hour ( `title`, `content`, `guid` , `published` , `lang` , `type` ,
`indegree` , `lon` , `lat` , `state` , `country` , `hour` )
VALUES ( "title" , "content 😊 content" , "guid" , 1, 1,
"WEBLOG", 1, 1, 1, "state" , "country" , 1 );
Query OK, 1 row affected, 2 warnings (0.00 sec)
mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A ...' for column 'content' at row 1 |
| Warning | 1265 | Data truncated for column 'published' at row 1 |
+---------+------+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 687302 |
+------------------+
1 row in set (0.00 sec)
mysql> select * from hour where id = 687302;
+--------+-------+----------+------+---------------------+
| id | title | content | guid | published |
+--------+-------+----------+------+---------------------+
| 687302 | title | content | guid | 0000-00-00 00:00:00 |
+--------+-------+----------+------+---------------------+
1 row in set (0.00 sec)
그러나 내 테이블 정의는 다음과 같습니다.
CREATE TABLE `hour` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(255) CHARACTER SET utf8 NOT NULL,
`content` text CHARACTER SET utf8 NOT NULL,
`guid` varchar(255) CHARACTER SET utf8 NOT NULL,
`published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`lang` tinyint(3) unsigned NOT NULL,
`type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
`indegree` int(4) unsigned NOT NULL,
`lon` float DEFAULT NULL,
`lat` float DEFAULT NULL,
`state` varchar(50) CHARACTER SET utf8 DEFAULT '',
`country` varchar(50) CHARACTER SET utf8 DEFAULT '',
`hour` int(2) DEFAULT NULL,
`gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
`time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687560 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288
CHARSET = utf8mb4를 사용하고 있음을 알 수 있습니다. 분명히 이것은 멀티 바이트 문자 사용과 관련된 문제를 해결합니까?
좋아, 그래서 나는 눈치 채지 못했다 :
`content` text CHARACTER SET utf8 NOT NULL,
나는 지금 그것을 수정했지만 여전히 펑키 한 결과를 얻습니다.
CREATE TABLE `hourtmp` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(255) CHARACTER SET utf8 NOT NULL,
`content` text NOT NULL,
`guid` varchar(255) CHARACTER SET utf8 NOT NULL,
`published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`lang` tinyint(3) unsigned NOT NULL,
`type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
`indegree` int(4) unsigned NOT NULL,
`lon` float DEFAULT NULL,
`lat` float DEFAULT NULL,
`state` varchar(50) CHARACTER SET utf8 DEFAULT '',
`country` varchar(50) CHARACTER SET utf8 DEFAULT '',
`hour` int(2) DEFAULT NULL,
`gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
`time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687563 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 |
mysql> INSERT INTO hourtmp ( `title`, `content`, `guid` , `published` , `lang` , `type` , `indegree` ,
`lon` , `lat` , `state` , `country` , `hour` ) VALUES ( "title" , "content 😊 content" ,
"guid" , 1, 1, "WEBLOG", 1, 1, 1, "state" , "country" , 1 );
Query OK, 1 row affected, 2 warnings (0.00 sec)
mysql> show warnings;
| Level | Code | Message |
| Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A ...' for column 'content' at row 1 |
| Warning | 1265 | Data truncated for column 'published' at row 1 |
2 rows in set (0.00 sec)
mysql> select * from hourtmp;
+--------+-------+-----------------------+
| id | title | content |
+--------+-------+-----------------------+
| 687560 | title | content ???? content |
| 687561 | title | content ???? content |
+--------+-------+-----------------------+
이제 응용 프로그램 계층의 모든 특수 문자를 제거하고 있으므로 문제가되지 않습니다. 그러나 어떻게 든 MySQL 내부 및 외부에서 데이터를 가져올 수 있는지 알고 싶습니다.
—
Bryan Hunt
아니 MySQL의 남자,하지만 당신은 지정할 수 없습니다
—
JNK
uft8
에 대한 TEXT
필드뿐만 아니라
세트 이름 utf8mb4를 실행 했습니까? 인서트를 발행하기 전에 고객으로부터?
—
atxdba
JNK, 텍스트 필드는 테이블 기본값 (이 경우 utf8mb4)을 사용합니다.
—
Bryan Hunt
atxdba. 제안에 감사드립니다, 여전히?로 나옵니다. 아마 손상된 것을 의미합니다. 그 이모티콘 / 디셉티콘을 젠장! ;)
—
Bryan Hunt