ฉันจะแทรกใบหน้าที่ยิ้มเข้าไปใน 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
ไบรอันฮัน

ไม่ใช่คนที่แต่งตัวประหลาด MySQL แต่คุณไม่สามารถระบุuft8สำหรับTEXTฟิลด์ได้
JNK

คุณได้ตั้งชื่อชุด utf8mb4; จากลูกค้าของคุณก่อนที่จะออกแทรก?
atxdba

JNK ฟิลด์ข้อความกำลังใช้ค่าเริ่มต้นของตารางในกรณีนี้ utf8mb4
Bryan Hunt

atxdba ขอบคุณสำหรับคำแนะนำยังคงออกมาเป็นซึ่งน่าจะหมายถึงความเสียหาย ประณามอิโมติคอน / พติคอนส์! ;)
Bryan Hunt

คำตอบ:


22

ผมเคยเขียนเมื่อเร็ว ๆ นี้เป็นคำแนะนำรายละเอียดเกี่ยวกับวิธีการที่จะเปลี่ยนจากของ MySQLutf8utf8mb4ไป หากคุณทำตามขั้นตอนที่นั่นทุกอย่างควรทำงานอย่างถูกต้อง นี่คือลิงก์โดยตรงไปยังแต่ละขั้นตอนในกระบวนการ:

ฉันสงสัยว่าปัญหาของคุณสามารถแก้ไขได้โดยทำตามขั้นตอนที่ 5 หวังว่านี่จะช่วยได้!


1
ออกจากงานนั้นแล้วจึงไม่สามารถทดสอบ / ตรวจสอบ อย่างไรก็ตามฉันสงสัยว่าการตั้งค่า collation-server = utf8mb4_unicode_ci คือสิ่งที่ขาดหายไป กวดวิชาที่ดี!
ไบรอันฮันต์

งัดดีมาก การเตือนความจำแก่ผู้คนรายละเอียดการเชื่อมต่อลูกค้าของคุณมีความสำคัญ ฉันกำลังใช้โมดูล NPM mysqlจาก Node และจำเป็นต้องระบุcharset: 'utf8mb4'ในการcreateConnection()โทรของฉันมิฉะนั้นการใส่อักขระ UTF8 จริงยังคงล้มเหลวด้วยIncorrect string valueข้อผิดพลาดแม้หลังจากแปลงตารางและคอลัมน์เป็นutf8mb4ชุดอักขระและการเปรียบเทียบ ฉันคาดว่ารายละเอียดระดับการกำหนดค่าไคลเอนต์ของคุณในขั้นตอนที่ 5 จะมีผลคล้ายกัน
Neek

2

ทำสิ่งต่อไปนี้:

  1. ตั้งค่าชุดอักขระฐานข้อมูลเป็นutf8mb4

  2. ตั้ง charset ของคอลัมน์เป็น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.