mysql - UTF-8 वर्णों के साथ परेशानी; मैं जो देखता हूं वह वह नहीं है जो मैंने संग्रहीत किया है




unicode character-encoding (3)

मैंने UTF-8 का उपयोग करने की कोशिश की और मुसीबत में चला गया।

मैंने बहुत सी चीजों की कोशिश की है; यहाँ मैं प्राप्त कर लिया है परिणाम हैं:

  • ???? एशियाई पात्रों के बजाय। यहां तक ​​कि यूरोपीय पाठ के लिए, मुझे Se?or मिला Se?or Señor
  • अजीब gibberish (Mojibake?) जैसे Señor 新浪新闻 या 新浪新闻
  • काले हीरे, जैसे Se or।
  • अंत में, मैं एक ऐसी स्थिति में आ गया, जहां डेटा खो गया था, या कम से कम छंटनी की गई थी: Se फॉर Señor
  • यहां तक ​​कि जब मुझे सही दिखने के लिए पाठ मिला, तो यह सही ढंग से हल नहीं हुआ।

मैं क्या गलत कर रहा हूं? मैं कोड कैसे तय कर सकता हूं? क्या मैं डेटा को पुनर्प्राप्त कर सकता हूं, यदि हां, तो कैसे?


मजेदार है कि आप अपने सवाल का जवाब कैसे देते हैं :)

  1. अपना कोड IDE भाषा UTF8 पर सेट करें

  2. अपने वेबपेज हेडर में जोड़ें जहां आप डेटा फॉर्म जमा करते हैं।

  3. अपनी MySQL तालिका की परिभाषा इस तरह देखें:

    CREATE TABLE your_table (
      ...
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  4. यदि आप पीडीओ का उपयोग कर रहे हैं, तो सुनिश्चित करें

    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8'); 
    $dbL = new PDO($pdo, $user, $pass, $options);

यदि आपको पहले से ही ऊपर की समस्या के साथ एक बड़ा डेटाबेस मिला है, तो आप सही चारसेट के साथ निर्यात करने के लिए SIDU की कोशिश कर सकते हैं, और UTF8 के साथ वापस आयात कर सकते हैं। सौभाग्य


यह समस्या इस साइट के प्रतिभागियों और कई अन्य लोगों को परेशान करती है।

आपने CHARACTER SET के पांच मुख्य मामलों को सूचीबद्ध किया है।

सर्वश्रेष्ठ प्रणालियां

आगे जाकर, CHARACTER SET utf8mb4 और COLLATION utf8mb4_unicode_520_ci का उपयोग करना सबसे अच्छा है। (पाइपलाइन में यूनिकोड समतलीकरण का एक नया संस्करण है।)

utf8mb4 , utf8 का एक सुपरसेट है, जिसमें यह 4-बाइट utf8 कोड्स को हैंडल करता है, जिनकी जरूरत इमोजी और कुछ चाइनीज को होती है।

MySQL के बाहर, "UTF-8" सभी आकार एन्कोडिंग को संदर्भित करता है, इसलिए प्रभावी रूप से MySQL के utf8mb4 के utf8mb4 , utf8 नहीं।

मैं निम्नलिखित में MySQL के अंदर बनाम भेद करने के लिए उन वर्तनी और पूंजीकरण का उपयोग करने का प्रयास करूंगा।

आपको क्या करना चाहिए इसका अवलोकन

  • अपने संपादक, आदि को UTF-8 पर सेट करें।
  • HTML फॉर्म को शुरू करना चाहिए <form accept-charset="UTF-8">
  • अपने बाइट्स को UTF-8 के रूप में एनकोड करें।
  • क्लाइंट में उपयोग किए जा रहे एन्कोडिंग के रूप में UTF-8 स्थापित करें।
  • कॉलम / तालिका को घोषित CHARACTER SET utf8mb4 घोषित करें ( SHOW CREATE TABLE साथ जांचें)।
  • HTML की शुरुआत में <meta charset=UTF-8>
  • संग्रहीत दिनचर्या वर्तमान चारसेट / समतलीकरण का अधिग्रहण करती है। उन्हें पुनर्निर्माण की आवश्यकता हो सकती है।

UTF-8 के माध्यम से सभी तरह से

कंप्यूटर भाषाओं के लिए और अधिक विवरण (और इसके निम्नलिखित खंड)

डेटा का परीक्षण करें

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

SELECT col, HEX(col) FROM tbl WHERE ...

सही ढंग से संग्रहीत UTF-8 के लिए HEX होगा

  • एक रिक्त स्थान के लिए (किसी भी भाषा में): 20
  • अंग्रेजी के लिए: 4x , 5x , 6x , या 7x
  • अधिकांश पश्चिमी यूरोप के लिए, उच्चारण पत्र Cxyy होना चाहिए
  • सिरिलिक, हिब्रू और फारसी / अरबी: Dxyy
  • अधिकांश एशिया: Exyyzz
  • इमोजी और कुछ चीनी: F0yyzzww
  • अधिक जानकारी

देखी गई समस्याओं के विशिष्ट कारण और सुधार

काटे गए पाठ ( Señor ):

  • संग्रहीत बाइट्स को utf8mb4 के रूप में एन्कोड नहीं किया गया है। इसे ठीक करो।
  • यह भी जांच लें कि पढ़ने के दौरान कनेक्शन UTF-8 है।

प्रश्न चिह्न के साथ काले हीरे ( Se or लिए Señor ); इनमें से एक मामला मौजूद है:

केस 1 (मूल बाइट्स UTF-8 नहीं थे):

  • संग्रहीत बाइट्स को utf8 के रूप में एन्कोड नहीं किया गया है। इसे ठीक करो।
  • INSERT और SELECT लिए कनेक्शन (या SET NAMES ) utf8 / utf8mb4 नहीं था। इसे ठीक करो।
  • इसके अलावा, जाँचें कि डेटाबेस में कॉलम CHARACTER SET utf8 (या utf8mb4) है।

केस 2 (मूल बाइट्स UTF-8 थे ):

  • SELECT लिए कनेक्शन (या SET NAMES ) utf8 / utf8mb4 नहीं था। इसे ठीक करो।
  • इसके अलावा, जाँचें कि डेटाबेस में कॉलम CHARACTER SET utf8 (या utf8mb4) है।

ब्लैक डायमंड्स तभी होते हैं जब ब्राउजर <meta charset=UTF-8>

प्रश्न चिह्न (नियमित वाले, काले हीरे नहीं) ( Se?or Señor ):

  • संग्रहीत बाइट्स को utf8 / utf8mb4 के रूप में एन्कोड नहीं किया गया है। इसे ठीक करो।
  • डेटाबेस में कॉलम CHARACTER SET utf8 (या utf8mb4) नहीं है। इसे ठीक करो। ( SHOW CREATE TABLE प्रयोग करें।)
  • यह भी जांच लें कि पढ़ने के दौरान कनेक्शन UTF-8 है।

Mojibake ( Señor Señor ): (यह चर्चा डबल एन्कोडिंग पर भी लागू होती है, जो दृश्यमान नहीं है।)

  • संग्रहीत बाइट्स को UTF-8-एन्कोडेड करने की आवश्यकता है। इसे ठीक करो।
  • जब कनेक्शन और SELECTing पाठ को utf8 या utf8mb4 निर्दिष्ट करने की आवश्यकता होती है। इसे ठीक करो।
  • कॉलम को CHARACTER SET utf8 (या utf8mb4) घोषित करने की आवश्यकता है। इसे ठीक करो।
  • HTML को <meta charset=UTF-8> शुरू करना चाहिए।

यदि डेटा सही दिखता है, लेकिन सही तरीके से सॉर्ट नहीं होगा, तो या तो आपने गलत कॉलेशन उठाया है, या कोई ऐसा कॉलेशन नहीं है जो आपकी जरूरत के अनुकूल हो, या आपके पास डबल एन्कोडिंग हो

ऊपर बताए गए SELECT .. HEX .. को करके डबल एन्कोडिंग की पुष्टि की जा सकती है।

é should come back C3A9, but instead shows C383C2A9
The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD

यही है, हेक्स लगभग दो बार है जब तक यह होना चाहिए। यह लैटिन 1 (या जो भी) से utf8 में परिवर्तित होने के कारण होता है, फिर उन बाइट्स का इलाज करना जैसे कि वे लैटिन 1 थे और रूपांतरण को दोहरा रहे थे। छँटाई (तुलना करना) सही ढंग से काम नहीं करता है क्योंकि यह है, उदाहरण के लिए, छँटाई के रूप में अगर स्ट्रिंग Señor थे।

डेटा को ठीक करना, जहां संभव हो

Truncation और Question Marks के लिए , डेटा खो जाता है।

Mojibake के लिए / डबल एन्कोडिंग , ...

काले हीरे के लिए , ...

(मुझे इसे दूसरे प्रश्न / उत्तर में जारी रखना होगा।)


सर्वर सेटअप कैसे होता है इसके आधार पर आपको तदनुसार एनकोड को बदलना होगा। utf8 ने जो कहा उससे आपको सबसे अच्छा काम करना चाहिए, लेकिन यदि आपके अजीब चरित्र हो रहे हैं तो यह मदद कर सकता है यदि आप वेबपेज एनकोड को एनसीआई में बदलते हैं। जब मैं एक PHP MYSQLI की स्थापना कर रहा था, तो इससे मुझे मदद मिली, इससे आपको और अधिक समझने में मदद मिल सकती है https://superuser.com/questions/762473/ansi-to-utf-8-in-notepad






mariadb