MySQL को UTF-8 को ठीक से कैसे बनायें


102

कल पूछे गए एक प्रश्न के जवाब में मैंने सुझाव दिया कि मुझे यह सुनिश्चित करना चाहिए कि मेरा डेटाबेस UTF-8 वर्णों को सही ढंग से संभाल सके। मैं MySQL के साथ यह कैसे कर सकता हूं?


4
मुझे वास्तव में उम्मीद है कि हमें एक व्यापक उत्तर मिलेगा, जिसमें विभिन्न MySQL संस्करण, असंगतताएं शामिल हैं, आदि
एडवर्ड जेड। यांग


1
@ EdwardZ.Yang - MySQL 4.1 पेश किया CHARACTER SETs; 5.1.24 जर्मन तेज-एस (,) के टकराव के साथ गड़बड़ हो गया, जिसे 5.1.62 में एक और टकराव जोड़कर ठीक किया गया (यकीनन इससे चीजें बदतर हो गईं); 5.5.3 ने नए charset utf8mb4 के साथ utf8 को भरा।
रिक जेम्स

1
यह प्रश्न काफी हद तक एक जैसा है .. कृपया उस stackoverflow.com/questions/3513773/…
Nyein Aung

यह इंगित करने योग्य है कि इनमें से अधिकांश उत्तर सीधे सादे गलत हैं। उपयोग न करें utf8। यह केवल 3-बाइट वर्ण तक का समर्थन करता है। सही चरित्र सेट जो आपको MySQL में उपयोग करना चाहिए utf8mb4
ब्रेंडन बर्ड

जवाबों:


89

अपडेट करें:

संक्षिप्त उत्तर - आपको लगभग हमेशा utf8mb4चारसेट और utf8mb4_unicode_ciकॉलेशन का उपयोग करना चाहिए ।

डेटाबेस बदलने के लिए:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

देख:

मूल उत्तर:

MySQL 4.1 और इसके बाद के संस्करण में UTF-8 का एक डिफ़ॉल्ट वर्ण सेट है। आप इसे अपनी my.cnfफ़ाइल में सत्यापित कर सकते हैं , क्लाइंट और सर्वर ( और ) दोनों को सेट करना याद रखें ।default-character-setcharacter-set-server

यदि आपके पास मौजूदा डेटा है जिसे आप UTF-8 में बदलना चाहते हैं, तो अपने डेटाबेस को डंप करें, और इसे वापस UTF-8 बनाने के रूप में आयात करें:

  • SET NAMES utf8डेटाबेस में क्वेरी / इंसर्ट करने से पहले उपयोग करें
  • DEFAULT CHARSET=utf8नए टेबल बनाते समय उपयोग करें
  • इस बिंदु पर आपका MySQL क्लाइंट और सर्वर UTF-8 (देखें my.cnf) में होना चाहिए । किसी भी ऐसी भाषा को याद रखें जिसका आप उपयोग करते हैं (जैसे PHP) यूटीएफ -8 भी होना चाहिए। PHP के कुछ संस्करण अपनी खुद की MySQL क्लाइंट लाइब्रेरी का उपयोग करेंगे, जो कि UTF-8 के बारे में पता नहीं हो सकता है।

यदि आप मौजूदा डेटा को माइग्रेट करना चाहते हैं तो पहले बैकअप के लिए याद रखें! डेटा के अजीब चॉपिंग तब हो सकती है जब चीजें नियोजित न हों!

कुछ संसाधन:


29
मेरी समझ यह है कि utf8MySQL के भीतर केवल पूर्ण यूनिकोड के एक छोटे सबसेट को संदर्भित करता है। आपको utf8mb4पूर्ण समर्थन को बाध्य करने के बजाय उपयोग करना चाहिए । Mathiasbynens.be/notes/mysql-utf8mb4 देखें "एक लंबे समय के लिए, मैं, के लिए डेटाबेस, टेबल, और स्तंभों MySQL के UTF8 चारसेट उपयोग कर रहा था यह सोचते हैं यह करने के लिए UTF-8 एन्कोडिंग ऊपर वर्णित मैप किया गया।"
हारून मैकडैड

7
MySQL में कभी भी UTF-8 का डिफ़ॉल्ट वर्ण सेट नहीं होता है। ४.१ और ५.x नवीनतम ५. use तक सभी का उपयोग latin1और latin1_swedish_ciडिफ़ॉल्ट चारसेट और कोलाजेशन के लिए। पुष्टि के लिए MySQL के मैनुअल में "सर्वर वर्ण सेट और मिलान" पृष्ठ देखें: dev.mysql.com/doc/refman/5.1/en/charset-server.html
जीववाद

2
@TimTisdall utf8mb4अधिकांश पाठ ASCII होने पर आपको अतिरिक्त संग्रहण की चिंता करने की आवश्यकता नहीं है। हालांकि charतार प्रचारित हैं, varcharतार नहीं हैं - इस दस्तावेज़ पृष्ठ पर अंतिम कुछ पंक्तियाँ देखें । उदाहरण के लिए, char(10)utf8mb4 के तहत 40 बाइट्स को निराशावादी आरक्षित varchar(10)किया जाएगा , लेकिन चर लंबाई एन्कोडिंग को ध्यान में रखते हुए बाइट आवंटित करेगा।
केविन ए। नौडे

1
@ केविन मुझे लगता है कि आपने इसे गलत समझा। मुझे लगता है कि अधिकतम पंक्ति की लंबाई 64k है। आप केवल एक utf8mb4 फ़ील्ड 1/4 बना सकते हैं क्योंकि इसमें उस स्थान को आरक्षित करना था। तो, भले ही यह ASCII है, आप केवल 16k अक्षर सम्मिलित कर सकते हैं।
टिम टिस्डल

1
@TimTisdall ओह, आप ऊपरी सीमा के बारे में बात कर रहे हैं। हाँ, वे कम हैं। सौभाग्य से, mysql के वर्तमान संस्करण स्वचालित रूप से अपग्रेड कर देंगे varchar(n)करने के लिए textडेटा प्रकार यदि आप एक परिवर्तन करने का प्रयास varchar(n)संभव बाइट आकार से भी बड़ा करने के लिए क्षेत्र (जबकि एक चेतावनी जारी करने वाले)। एक इंडेक्स में एक सबसे खराब स्थिति वाला ऊपरी बाउंड भी होगा, और यह अन्य समस्याएं पेश कर सकता है।
केविन ए। नौडे

44

इसे 'स्थायी' बनाने के लिए my.cnf:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

जाँच करने के लिए, ग्राहक के पास जाएँ और कुछ चर दिखाएँ:

SHOW VARIABLES LIKE 'character_set%';

सत्यापित करें कि वे सभी हैं utf8, सिवाय ..._filesystem, जो होना चाहिएbinary और ..._dir, जो MySQL स्थापना में कहीं और इंगित करता है।


यह मेरे मामले में काम नहीं करता था, लेकिन मैंने दी गई सामग्री के साथ / आदि में my.cf फ़ाइल बनाई। मैंने इस्तेमाल कियाcreate table my_name(field_name varchar(25) character set utf8);
मारेक बार

"SHOW VIAIABLES LIKE 'character_set%';" कमांड ने मेरे कनेक्शन के साथ समस्या का खुलासा किया। धन्यवाद!
javsmo

1
यह सही नहीं है। MySQL कॉल utf8"पूर्ण" UTF-8 नहीं है।
TWR कोल

32

MySQL 4.1 और इसके बाद के संस्करण में एक डिफ़ॉल्ट वर्ण सेट है जिसे वह कॉल करता है utf8 लेकिन जो वास्तव में केवल UTF-8 का एक सबसेट है (केवल तीन-बाइट वर्ण और छोटे की अनुमति देता है)।

utf8mb4यदि आप "पूर्ण" UTF-8 चाहते हैं तो अपने चार्टसेट के रूप में उपयोग करें ।


5
निश्चित रूप से सहमत हूं, यह एकमात्र सही उत्तर है। utf8इमोटिकॉन्स की तरह आकर्षण शामिल नहीं है। utf8mb4कर देता है। अद्यतन करने के तरीके के बारे में अधिक जानकारी के लिए इसे देखें: mathiasbynens.be/notes/mysql-utf8mb4
jibai31

@ बस्ती - हाल ही में सही (लैटिन 1 हाल ही में तक डिफ़ॉल्ट था), और पूरा नहीं (utf8-एन्कोडेड डेटा को सही ढंग से सम्मिलित / चयन करने पर चर्चा नहीं करता है, और न ही html में प्रदर्शित करता है)।
रिक जेम्स

सम्मानपूर्वक, @RickJames, Basti ने कहा "अब तक" - जब मैंने यह पोस्ट किया तो मुझे आपका उत्तर याद नहीं है।
TWR कोल

काश, utf8 समस्याओं के लगभग 5 अलग-अलग लक्षण हैं, और लगभग 4 चीजें जो प्रोग्रामर को परेशानी का कारण बनाती हैं। अधिकांश उत्तर केवल एक ही बात को इंगित करते हैं जिसे फिक्सिंग की आवश्यकता हो सकती है। मूल प्रश्न व्यापक था, इसलिए उत्तर सभी की आवश्यकता थी 4. शायद बस्ती एक लक्षण से परिचित था जिसके लिए आपका एक पहलू समाधान था।
रिक जेम्स

8
एक तरफ के रूप में, मैं एक पल को रोकना चाहता हूं और MySQL टीम को वास्तव में अच्छा, कठिन घूरना देना चाहता हूं। तुम लोग क्या सोच रहे थे? क्या आपको एहसास है कि आपने "utf8" नामक एक प्रोग्राम में कोडपेज बनाकर कितना भ्रम पैदा किया है, जो वास्तव में UTF-8 नहीं है? गोड्डामन गधे। </ rant>
TWR कोल

20

संक्षिप्त उत्तर: utf8mb44 स्थानों पर उपयोग करें :

  • आपके ग्राहक में बाइट्स utf8 हैं, न कि लैटिन 1 / cp1251 / etc।
  • SET NAMES utf8mb4 या MySQL के लिए क्लाइंट के कनेक्शन को स्थापित करते समय कुछ समान
  • CHARACTER SET utf8mb4 सभी तालिकाओं / स्तंभों पर - ऐसे स्तंभों को छोड़कर, जो सख्ती से ascii / hex / country_code / zip_code / etc हैं।
  • <meta charset charset=UTF-8>यदि आप HTML में आउटपुट कर रहे हैं। (हाँ यहाँ वर्तनी अलग है।)

अधिक जानकारी ;
सभी तरह UTF8

उपरोक्त लिंक "सभी चिंताओं को दूर करने के लिए विस्तृत विहित जवाब की आवश्यकता है" प्रदान करते हैं। - इस मंच पर एक स्थान की सीमा है।

संपादित करें

CHARACTER SET utf8mb4"सभी" दुनिया के पात्रों को शामिल करने के अलावा , COLLATION utf8mb4_unicode_520_ciउपयोग करने के लिए 'सर्वश्रेष्ठ ऑल-अराउंड' टकराव के बारे में यकीन है। (उन भाषाओं के लिए तुर्की, स्पैनिश, आदि भी हैं, जो उन भाषाओं में बारीकियां चाहते हैं।)


कैसे आप प्राप्त उत्पादन से utf8 समस्याओं डिबग करने के लिए पर मेरा नया लिंक
रिक जेम्स

यूनिकोड_520_ci चारों ओर सबसे अच्छा क्यों नहीं है: stackoverflow.com/a/49982378/62202
लुई

@ लुईस - और जैसा कि मैंने स्पेनिश और तुर्की (साथ ही पोलिश) को सूचित किया है कि उपयोगकर्ता खुश नहीं हो सकते। "बेस्ट ऑल-अराउंड" हर किसी को कुछ तकलीफ देता है। MySQL 8.0 में एक नया "सबसे अच्छा" कोलाज है : utf8mb4_0900_ai_ci । काश, फिर से एल = =।
रिक जेम्स

4

चारसेट डेटाबेस (डिफ़ॉल्ट) और तालिका की एक संपत्ति है। आपके पास एक नज़र (MySQL कमांड) हो सकती है:

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

दूसरे शब्दों में; अपने डेटाबेस को चेक करना या इसे बदलना बहुत आसान है:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;

1
यह सही नहीं है। MySQL कॉल utf8"पूर्ण" UTF-8 नहीं है।
TWR कोल

3

डेटाबेस के लिए UTF-8 में वर्ण सेट एन्कोडिंग को बदलने के लिए, mysql> प्रॉम्प्ट पर निम्न कमांड टाइप करें। USE ALTER DATABASE.. डेटाबेस नाम के साथ DBNAME बदलें:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

यह इस सवाल का एक डुप्लिकेट है कि कैसे एक पूरे MySQL डेटाबेस वर्ण और कोलाज को UTF-8 में परिवर्तित किया जाए?


2

मैंने जेवियर के समाधान का पालन किया, लेकिन मैंने my.cnf में कुछ अलग लाइनें जोड़ीं:

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

मुझे यह विचार यहां मिला: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html पृष्ठ के निचले भाग पर पहले / केवल उपयोगकर्ता टिप्पणी में। उन्होंने उल्लेख किया है कि स्किप-कैरेक्टर-सेट-क्लाइंट-हैंडशेक का कुछ महत्व है।


यह अप्रमाणित, शून्य-वोट का जवाब केवल एक चीज थी जिसने मेरी मदद की! तो यह मेरा वोट हो जाता है, यह सुनिश्चित करने के लिए है। skip-character-set-client-handshakeकुंजी थी।
मार्कस


0

डेटाबेस डिफ़ॉल्ट पर लागू करने के database collationलिए अपना सेट करें ।UTF-8table collation


-1

आपका उत्तर है कि आप MySql सेटिंग्स द्वारा कॉन्फ़िगर कर सकते हैं। मेरे उत्तर में कुछ संदर्भ से बाहर हो सकता है, लेकिन यह भी पता है कि आपके लिए मदद है।
कैसे कॉन्फ़िगर करें Character SetऔरCollation

डिफ़ॉल्ट MySQL वर्ण सेट और कोलाजेशन ( latin1, latin1_swedish_ci) का उपयोग करके डेटा स्टोर करने वाले अनुप्रयोगों के लिए , किसी विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं होनी चाहिए। यदि एप्लिकेशन को किसी भिन्न वर्ण सेट या कॉलेशन का उपयोग करके डेटा संग्रहण की आवश्यकता होती है, तो आप वर्ण सेट जानकारी को कई तरीकों से कॉन्फ़िगर कर सकते हैं:

  • प्रति डेटाबेस वर्ण सेटिंग्स निर्दिष्ट करें। उदाहरण के लिए, एक डेटाबेस का उपयोग करने वाले अनुप्रयोगों की आवश्यकता हो सकती है utf8, जबकि अन्य डेटाबेस का उपयोग करने वाले अनुप्रयोगों के लिए sjis की आवश्यकता हो सकती है।
  • सर्वर स्टार्टअप पर वर्ण सेटिंग्स निर्दिष्ट करें। यह सर्वर को उन अनुप्रयोगों के लिए दी गई सेटिंग्स का उपयोग करने का कारण बनता है जो अन्य व्यवस्था नहीं करते हैं।
  • कॉन्फ़िगरेशन समय पर वर्ण सेटिंग्स निर्दिष्ट करें , यदि आप स्रोत से MySQL का निर्माण करते हैं। यह सर्वर को सभी अनुप्रयोगों के लिए दिए गए सेटिंग्स का उपयोग करने का कारण बनता है, बिना उन्हें सर्वर स्टार्टअप पर निर्दिष्ट किए बिना।

Utf8 वर्ण सेट करने के लिए आपके प्रश्न के लिए यहां दिखाए गए उदाहरण, यहां अधिक सहायक ( utf8_general_cicollation`) के लिए टकराव भी सेट करते हैं ।

प्रति डेटाबेस वर्ण सेटिंग्स निर्दिष्ट करें

  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

सर्वर स्टार्टअप पर वर्ण सेटिंग्स निर्दिष्ट करें

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

MySQL कॉन्फ़िगरेशन समय पर वर्ण सेटिंग्स निर्दिष्ट करें

shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

आपके कनेक्शन पर लागू होने वाले वर्ण सेट और कॉलेशन सिस्टम चर के मूल्यों को देखने के लिए, इन कथनों का उपयोग करें:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

यह लंबा जवाब हो सकता है लेकिन सभी तरह से है, आप इसका उपयोग कर सकते हैं। उम्मीद है मेरा जवाब आपके लिए मददगार हो। अधिक जानकारी के लिए http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


-2

SET NAMES UTF8

यह चाल है


2
उपयोग करते समय SET NAMES UTF8(या UTF8mb4) सही है, आप यह नहीं समझाते हैं कि यह क्या करता है (इस कनेक्शन के लिए उपयोग किया जाने वाला वर्ण सेट)। "यह चाल करता है" ऐसा लगता है कि यह समस्या को हल करेगा (MySQL को UTF-8 को ठीक से बनाए), लेकिन कई MySQL डेटाबेस डिफ़ॉल्ट रूप से लैटिन 1 में सेट होते हैं, जिससे यह एक उचित समाधान नहीं होगा। मैं डिफ़ॉल्ट charset और तालिका charsets को utf8mb4 में बदल दूंगा। वास्तव में, यह उत्तर अधूरा है, इसलिए मैंने इसे अस्वीकृत कर दिया।
बेसिक 6

-2

UTF-8 के लिए डाटा कनेक्शन

$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());

-3

अपना डेटाबेस कनेक्शन UTF8 पर सेट करें:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){          
         //set to utf8 encoding
         mysql_set_charset('utf8',$handle);
  }

यदि PHP चल रहा है, तो पदावनत mysql_*इंटरफ़ेस का उपयोग न करें । स्विच करने mysqli_*या PDO
रिक जेम्स

-3

समाधान खोजने में सक्षम था। के रूप में निर्दिष्ट निम्नलिखित दौड़ा http://technoguider.com/2015/05/utf8-set-up-in-mysql/

SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;

अंतिम दो पंक्तियाँ निरर्थक हैं, क्योंकि पहले वाले में पहले से ही शामिल हैं: dev.mysql.com/doc/refman/5.0/en/charset-connection.html
डैनियल

साथ ही पूरा समाधान नहीं। कॉलम की जरूरत है CHARACTER SET utf8rootसभी महत्वपूर्ण को निष्पादित नहीं करेगा init_connect
रिक जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.