웃는 얼굴을 MySQL에 삽입하는 방법 (😊)


18

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의 남자,하지만 당신은 지정할 수 없습니다 uft8에 대한 TEXT필드뿐만 아니라
JNK

세트 이름 utf8mb4를 실행 했습니까? 인서트를 발행하기 전에 고객으로부터?
atxdba

JNK, 텍스트 필드는 테이블 기본값 (이 경우 utf8mb4)을 사용합니다.
Bryan Hunt

atxdba. 제안에 감사드립니다, 여전히?로 나옵니다. 아마 손상된 것을 의미합니다. 그 이모티콘 / 디셉티콘을 젠장! ;)
Bryan Hunt

답변:


22

최근에 MySQL에서 utf8로 전환하는 방법에 대한 자세한 가이드를utf8mb4 작성 했습니다 . 이 단계를 수행하면 모든 것이 올바르게 작동합니다. 다음은 프로세스의 각 개별 단계에 대한 직접 링크입니다.

5 단계를 수행하여 문제를 해결할 수 있다고 생각합니다. 희망이 있습니다.


1
해당 작업을 그대로두고 테스트 / 확인할 수 없습니다. 그러나 collation-server = utf8mb4_unicode_ci 설정이 누락 된 것으로 의심됩니다. 좋은 튜토리얼!
Bryan Hunt

아주 좋은 Mathias. 사람들에게 알림, 클라이언트 연결 세부 정보가 중요합니다. mysql노드 에서 NPM 모듈 을 사용하고 charset: 'utf8mb4'있으며 createConnection()호출 에서 지정해야 했습니다 . 그렇지 않으면 Incorrect string value테이블과 열을 utf8mb4문자 집합 및 데이터 정렬 로 변환 한 후에도 오류 로 인해 진정한 UTF8 문자를 삽입하는 데 여전히 실패했습니다 . 5 단계의 클라이언트 구성 레벨 세부 사항이 유사한 영향을 미칠 것으로 예상됩니다.
Neek

2

다음을 수행하십시오.

  1. 데이터베이스 문자 세트를 utf8mb4로 설정하십시오.

  2. 열의 문자 세트를 utf8mb4로 설정하십시오.

아래 쿼리처럼 :

ALTER TABLE `comments` CHANGE `text` `text` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

이 단계들로 충분합니까? 허용되는 답변에는 더 많은 것이 있습니다.
Colin 't Hart

문제가 무엇인지에 따라 문제가 데이터베이스쪽에 있으면 충분합니다. 그러나 클라이언트 연결 문제이기도합니다.
spydon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.