MySQL डाटाबेस में इमोजी कैरेक्टर को कैसे स्टोर करें


172

मैं अपने प्रोजेक्ट में इमोजी कैरेक्टर का इस्तेमाल कर रहा हूं। उस अक्षर को mysql डेटाबेस में सहेजा जाता है (??)। मैंने डेटाबेस डिफ़ॉल्ट कॉलेशन में उपयोग किया था utf8mb4_general_ci। यह दिखाते हैं

1366 गलत स्ट्रिंग मान: पंक्ति 1 पर 'टिप्पणी' के लिए '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...'


1
आपके डेटा की बचत कैसे हो रही है? क्या आप हमें वह कोड दिखा सकते हैं?
टॉमस बुटेलर सेप

1
आपके कमेंट के लिए धन्यवाद। मैं इस परिवर्तन डेटाबेस डिफ़ॉल्ट संग्रह के लिए ** utf8mb4 ** के रूप में समाधान ढूंढता हूं और तालिका संग्रह ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ** के रूप में भी बदलें। ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
सेल्वामणि पी।

1
कोड: insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29'utf8mb4 को डेटाबेस कनेक्शन में सेट करें: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
सेल्वामणि पी

जवाबों:


29

चरण 1, अपने डेटाबेस का डिफ़ॉल्ट चार्ट बदलें:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

चरण 2, तालिका बनाते समय चारसेट सेट करें:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

या परिवर्तन तालिका

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;

मैंने इन प्रश्नों का पालन किया और mysql सर्वर को बंद कर दिया और पुनः आरंभ किया, लेकिन जब मैं अपने टेबल में इमोजीस डालने की कोशिश करता हूं तब भी मुझे वही त्रुटि मिलती है। INSERT को छोड़कर सभी आदेश सफल हुए। INSERT INTO प्रविष्टियाँ (दिनांक, समय, कैप्शन) VALUES (2018-05-20 ', '12: 38: 00', 'इमोजी के साथ परीक्षण विवरण:' '); स्तंभ सेटिंग्स हैं: Collf: utf8mb4_0900_ai_ci परिभाषा: वर्णन पाठ

1
यह काम करने के लिए आपके कनेक्शन को utf8mb4 नहीं utf8 होना चाहिए।
हेनरिक हैंन

3
@ospider, चरण 2 में आप यूनिकोड के बजाय utfmb4_general_ci का उपयोग करते हैं - किसी भी कारण से?
वॉरेन

263

1) डाटाबेस: डाटाबेस डिफॉल्ट कोलेशन के रूप में बदलें utf8mb4

2) टेबल: परिवर्तन तालिका के रूप में टकराव CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

प्रश्न:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) कोड:

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4) utf8mb4डेटाबेस कनेक्शन में सेट करें :

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');

4
क्या डेटाबेस डिफ़ॉल्ट संग्रह को बदले बिना संभव है?
अलीएन 11

23
यह मेरे लिए काम नहीं कर रहा है। मैं समझ रहा हूं "???" स्माइली के बजाय। केवल "this" यह आसानी से डेटाबेस में सुरक्षित रूप से बना दिया।
जिज्ञासु डेवलपर

10
केवल utf8mb4 के लिए तालिका को अद्यतन करने की आवश्यकता नहीं हो सकती है, लेकिन स्वयं कॉलम भी, अन्यथा वे अभी भी प्रकट हो सकते हैं ?? 💙 के बजाय।
ऐल

2
मेरे लिए काम किया है, लेकिन MySQL को पुनरारंभ करने के लिए मत भूलना।
रवि मिश्रा

8
SET NAMES utf8mb4;इमोटिकॉन्स को बचाने के लिए मुझे दौड़ने की जरूरत है ; इससे पहले कि यह कमांड उन्हें बचा रहा था??
क्यूबक

18

डेटाबेस और टेबल दोनों में कैरेक्टर सेट utf8mb4और कॉलेशन होना चाहिए utf8mb4_unicode_ci

एक नया डेटाबेस बनाते समय आपको इसका उपयोग करना चाहिए:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

यदि आपके पास एक मौजूदा डेटाबेस है और आप समर्थन जोड़ना चाहते हैं:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

आपको अपनी तालिका के लिए सही वर्ण सेट और टकराने की भी आवश्यकता है :

CREATE TABLE IF NOT EXISTS table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

यदि आपने बहुत सी डेटा वाली मौजूदा तालिकाएँ प्राप्त की हैं, तो इसे बदलें :

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ध्यान दें कि utf8_general_ciअब अनुशंसित सर्वोत्तम अभ्यास नहीं है। संबंधित प्रश्नोत्तर देखें:

स्टैक ओवरफ्लो पर utf8_general_ci और utf8_unicode_ci के बीच क्या अंतर है


मैं एक डेटाबेस और तालिका युक्त data.and है जब दूसरा बदलने बयान को क्रियान्वित करने का कहना है कि: त्रुटि 1833 (HY000): नहीं कर पा रहे परिवर्तन कॉलम 'id': एक विदेशी कुंजी बाधा तालिका के 'FK12njtf8e0jmyb45lqfpt6ad89' 'lizbazi.post' में इस्तेमाल किया
सैय्यद महिदियार ज़ेरेपूस

: - @SeyyedMahdiyarZerehpoush आप यहां बताए अनुसार, विशिष्ट स्तंभ से उसके लिए आवश्यक करने के लिए अपने अद्यतन सीमित के साथ भाग प्राप्त करने में सक्षम हो सकता है stackoverflow.com/a/15781925/1247581 जैसेALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain

किसी भी भिन्न जब कॉलम के लिए utf8mb4_binबनाम का उपयोग कर utf8mb4_unicode_ci?
मुहम्मद उमर असलम

14

यदि आप Solr + Mysql + Java का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं:

इसका उपयोग किया जा सकता है:

  • case1: जब आप DB को बदलना नहीं चाहते।
  • case2: जब आपको अपने मैसकल से सोलर कोर तक इमोटिकॉन्स आयात करना होगा।

उपरोक्त मामले में यह आपके इमोटिकॉन्स को आपके सिस्टम में संग्रहीत करने का एक उपाय है।

इसका उपयोग करने के लिए कदम:

पुस्तकालय का इस्तेमाल किया: आयात java.net.URLDecoder; आयात java.net.URLEncoder;

  1. अपने स्ट्रिंग का इमोटिकॉन्स रखने के लिए urlEncoder का उपयोग करें।
  2. मैसुकलडीबी को बदले बिना डीबी में स्टोर करें।
  3. आप चाहें तो इसे सॉल कोर (डीकोडेड फॉर्म) में स्टोर कर सकते हैं या आप इनकोडिंग फॉर्म को स्टोर कर सकते हैं।
  4. डीबी या सोलर कोर से इन इमोटिकॉन्स लाने पर अब आप इसे urlDecoder का उपयोग करके डिकोड कर सकते हैं।

कोड उदाहरण:

import java.net.URLDecoder;
import java.net.URLEncoder;

public static void main(String[] args) {
    //SpringApplication.run(ParticipantApplication.class, args);
    System.out.println(encodeStringUrl("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
    System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}

public static String encodeStringUrl(String url) {
    String encodedUrl =null;
    try {
         encodedUrl = URLEncoder.encode(url, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return encodedUrl;
    }
    return encodedUrl;
}

public static String decodeStringUrl(String encodedUrl) {
    String decodedUrl =null;
    try {
         decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return decodedUrl;
    }
    return decodedUrl;
}

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
टोबी स्पाइट 8

1
एक आकर्षण की तरह काम करते हैं, मैंने इसे मॉडल में उपयोग किया है, इसलिए मुझे वास्तव में किसी भी कोड और डेटाबेस को बदलने की जरूरत नहीं है केवल सामग्री के
सेटटर और गेट्टर

1
एन्कोड / डिकोड फ़ंक्शन कॉल से परेशानी होती है। इसके बजाय विभिन्न स्थानों में चारसेट सेटिंग को ठीक करें।
रिक जेम्स

1
यह समस्या का समाधान नहीं है, यह इसे दरकिनार कर रहा है। और आप इस पद्धति के साथ समस्याओं की मेजबानी में भाग लेंगे, उदाहरण के लिए आप अपने आवेदन को धीमा कर देंगे क्योंकि आपको सब कुछ डिकोड और एनकोड करना होगा। इसके अलावा यदि आप चरित्र में प्रवेश करते हैं %, तो आपका डिकोडिंग टूट जाएगा।
जोनाथन लालिबेरटे

14

मैंने अपने डेटाबेस और तालिका को utf8 से utf8mb4 में अपग्रेड किया है । लेकिन मेरे लिए कुछ भी काम नहीं करता है। फिर मैंने कॉलम डेटाटाइप को ब्लॉब में अपडेट करने की कोशिश की , सौभाग्य से यह मेरे लिए काम करता है और डेटा सहेजा गया है। यहां तक ​​कि मेरा डेटाबेस और टेबल दोनों CHARACTER SET utf8 COLLATE utf8_unicode हैं


13

स्तंभ को संशोधित करने का आदेश है:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

और हमें टाइप = का उपयोग करने की आवश्यकता है BLOB

संशोधित करने के लिए उदाहरण निम्नानुसार है: -

ALTER TABLE messages MODIFY content BLOB;

मैंने जाँच की कि नवीनतम mySQL और अन्य डेटाबेस ''को table_name, column_name आदि पर कमांड का उपयोग करने की आवश्यकता नहीं है ।

डेटा प्राप्त करें और डेटा सहेजें: सीधे चैट सामग्री को कॉलम में सहेजें और डेटा को पुनः प्राप्त करने के लिए, (byte[])db कॉलम से बाइट सरणी के रूप में डेटा प्राप्त करें और फिर इसे stringउदाहरणार्थ (जावा कोड) में बदलें

new String((byte[]) arr) 

2
हाँ। यदि आपको केवल एक निश्चित क्षेत्र में इमोजीस की तरह यूनिकोड को स्टोर करने की आवश्यकता है, तो स्वीकृत उत्तर बहुत अधिक दखल देने वाला है, बस text/ varcharफ़ील्ड को ए में बदलें blobऔर आप कर रहे हैं। संपूर्ण DB पर चारसेट और
कोलाज

9

मेरा जवाब केवल सेल्वमनी पी उत्तर में जोड़ता है।

आपको किसी भी SET NAMES utf8प्रश्न को बदलने की आवश्यकता हो सकती है SET NAMES utf8mb4। यही मेरे लिए चाल चली।

साथ ही, यह आपकी वेबसाइट को utf8 से utf8mb4 पर पोर्ट करने के लिए एक शानदार लेख है। विशेष रूप से लेख utf8mb4 में परिवर्तित करने के बाद अनुक्रमित और मरम्मत तालिकाओं पर 2 अच्छे अंक बनाता है:

अनुक्रमित

Utf8 से utf8mb4 में कनवर्ट करते समय, एक कॉलम या इंडेक्स की की अधिकतम लंबाई बाइट्स के संदर्भ में अपरिवर्तित होती है। इसलिए, यह पात्रों के संदर्भ में छोटा है, क्योंकि एक चरित्र की अधिकतम लंबाई अब तीन के बजाय चार बाइट्स है। [...] InnoDB स्टोरेज इंजन की अधिकतम इंडेक्स लंबाई tes६, बाइट्स है, इसलिए utf8 या utf8mb4 कॉलम के लिए, आप क्रमशः २५५ या १ ९ १ अक्षरों की अधिकतम इंडेक्स कर सकते हैं। यदि आपके पास वर्तमान में 191 वर्णों से अधिक अनुक्रमित वाले utf8 कॉलम हैं, तो आपको utf8mb4 का उपयोग करते समय कम संख्या में वर्णों को अनुक्रमित करना होगा।

मरम्मत के कार्य

MySQL सर्वर को अपग्रेड करने और ऊपर बताए गए आवश्यक बदलाव करने के बाद, सभी डेटाबेस और तालिकाओं की मरम्मत और अनुकूलन सुनिश्चित करें। मैंने इसे अपग्रेड करने के तुरंत बाद नहीं किया (मुझे नहीं लगता था कि यह आवश्यक था, क्योंकि पहली नज़र में सब कुछ ठीक लग रहा था), और कुछ अजीब बग्स में भाग गए, जहां UPDATE के बयानों का कोई प्रभाव नहीं पड़ा, भले ही कोई त्रुटियों को फेंक दिया गया।

लेख पर तालिकाओं की मरम्मत करने के लिए प्रश्नों के बारे में अधिक पढ़ें।


REPAIR TABLEऔर OPTIMIZE TABLEअनावश्यक होना चाहिए - ALTERउन्हें करने का प्रभाव पड़ता है।
रिक जेम्स

5

उपरोक्त बिंदुओं में मुख्य बिंदु का उल्लेख नहीं किया गया है,

हमें विकल्पों के साथ "useUnicode=yes"और "characterEncoding=UTF-8"कनेक्शन स्ट्रिंग में क्वेरी स्ट्रिंग पास करने की आवश्यकता है

कुछ इस तरह

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

5

ठीक है, आपको संपूर्ण डीबी चारसेट को बदलने की आवश्यकता नहीं है। इसके बजाय आप कॉलम को ब्लॉब प्रकार में बदलकर कर सकते हैं ।

वैकल्पिक संदेश मोड सामग्री BLOB;


3

आपके पास समय बचाने के लिए मेरे पास एक अच्छा उपाय है। मैं भी इसी समस्या से मिलता हूं लेकिन मैं पहले जवाब से इस समस्या को हल नहीं कर सका।

आपका डिफ्रेंट कैरेक्टर utf-8 है। लेकिन इमोजी को इसका समर्थन करने के लिए utf8mb4 की जरूरत है। यदि आपको mysql की कॉन्फ़िगर फ़ाइल को संशोधित करने की अनुमति है, तो आप इस चरण का अनुसरण कर सकते हैं।

इसलिए, अपने चरित्र सेट (utf-8 से utf8mb4 तक) को अपग्रेड करने के लिए यह निम्न चरण करें।

चरण 1. mysql के लिए my.cnf खोलें, इन चरणों को अपने my.cnf में जोड़ें।

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4


[client]
default-character-set = utf8mb4

चरण 2। अपनी mysql सेवा बंद करें, और mysql सेवा शुरू करें

mysql.server stop
mysql.server start

ख़त्म होना! फिर आप अपने चरित्र को utf8mb4 में बदल सकते हैं।

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name            | Value                                                    |
+--------------------------+----------------------------------------------------------+
| character_set_client     | utf8mb4                                                  |
| character_set_connection | utf8mb4                                                  |
| character_set_database   | utf8mb4                                                  |
| character_set_filesystem | binary                                                   |
| character_set_results    | utf8mb4                                                  |
| character_set_server     | utf8mb4                                                  |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)

2

टेक स्टैक वाले आवेदन के लिए इमोजी समर्थन - mysql, जावा, स्प्रिंगबूट, हाइबरनेट

यूनिकोड समर्थन के लिए mysql में नीचे परिवर्तन लागू करें।

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

DB कनेक्शन - jdbc url परिवर्तन:

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

नोट - यदि उपरोक्त चरण काम नहीं कर रहा है तो कृपया mysql-कनेक्टर संस्करण को 8.0.15 पर अपडेट करें। (यूसीकोड समर्थन के लिए कनेक्टर संस्करण 8.0.15 के साथ mysql 5.7 काम करता है)


1

मेरे लिए जो सबसे सरल उपाय काम करता है वह है डेटा को json_encode के रूप में संग्रहित करना ।

बाद में जब आप पुनः प्राप्त करते हैं तो सुनिश्चित करें कि आपने इसे json_decode किया है।

यहां आपको डेटाबेस और तालिका के कोलाजेशन या वर्ण सेट को बदलना नहीं है।


0

किसी के लिए एक प्रबंधित MySQL उदाहरण (एडब्ल्यूएस आरडीएस पर मेरे मामले में) को हल करने का प्रयास करने के लिए, सबसे आसान तरीका था पैरामीटर समूह को संशोधित करना और क्रमशः और , होने के लिए सर्वर वर्ण सेट और टकराव सेट करना । सर्वर को रिबूट करने के बाद, एक त्वरित क्वेरी सिस्टम डेटाबेस और किसी भी नए बनाए गए लोगों के लिए सेटिंग्स की पुष्टि करता है:utf8mb4utf8mb4_bin

SELECT * FROM information_schema.SCHEMATA S;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.