웃는 얼굴을 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.