मैं कैसे MySQL में स्माइली चेहरे सम्मिलित कर सकता हूं (y)


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।
ब्रायन हंट

atxdba। सुझाव के लिए धन्यवाद, अभी भी के रूप में बाहर आता है? जो संभवतः भ्रष्ट का मतलब है। धिक्कार है उन इमोटिकॉन्स / धोखेबाजों को! ;)
ब्रायन हंट

जवाबों:


22

मैंने हाल ही में MySQL से स्विच करने के तरीके पर एक विस्तृत गाइडutf8utf8mb4 लिखा है । यदि आप वहां के चरणों का पालन करते हैं, तो सब कुछ सही ढंग से काम करना चाहिए। इस प्रक्रिया में प्रत्येक व्यक्तिगत चरण के लिए सीधे लिंक दिए गए हैं:

मुझे संदेह है कि चरण 5 का पालन करके आपकी समस्या को हल किया जा सकता है। आशा है कि यह मदद करता है!


1
उस काम को छोड़ दिया है ताकि परीक्षण / सत्यापन करने में असमर्थ हो। हालाँकि मुझे संदेह है कि collation-server = utf8mb4_unicode_ci सेटिंग वह है जो गायब था। अच्छा ट्यूटोरियल!
ब्रायन हंट

बहुत अच्छा मैथियास। लोगों को एक अनुस्मारक, आपके ग्राहक कनेक्शन का विवरण मायने रखता है। मैं mysqlनोड से एनपीएम मॉड्यूल का उपयोग कर रहा हूं , और charset: 'utf8mb4'मेरी createConnection()कॉल में निर्दिष्ट करने की आवश्यकता है , अन्यथा Incorrect string valueतालिका और स्तंभ को utf8mb4वर्ण सेट और टकराव में परिवर्तित करने के बाद भी, सही UTF8 वर्ण सम्मिलित करना त्रुटि के साथ विफल रहा । मुझे उम्मीद है कि चरण 5 में आपके ग्राहक के विन्यास स्तर का विवरण समान प्रभाव होगा।
नेक

2

निम्नलिखित कार्य करें:

  1. डेटाबेस को utf8mb4 पर सेट करें

  2. Utf8mb4 के लिए कॉलम की शुरुआत सेट करें

क्वेरी के नीचे की तरह:

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

क्या ये कदम वास्तव में पर्याप्त हैं? स्वीकृत उत्तर में कई और हैं।
कॉलिन 'टी हार्ट हार्ट

निर्भर करता है कि समस्या क्या थी, अगर समस्या डेटाबेस की तरफ थी तो यह पर्याप्त है। लेकिन यह बहुत अच्छी तरह से एक ग्राहक कनेक्शन समस्या हो सकती है।
स्पाइडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.