Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

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

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

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

सर्वोत्तम अभ्यास

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

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

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

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

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

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

UTF- 8 पूरे रास्ते

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

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

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

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

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

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

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

छोटा गया टेक्स्ट (Se Señor . के लिए ):

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

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

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

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

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

  • कनेक्शन (या SET NAMES ) SELECT . के लिए 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 है।

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

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

यदि डेटा सही दिखता है, लेकिन सही ढंग से क्रमबद्ध नहीं होगा, तो या तो आपने गलत संयोजन चुना है, या आपकी आवश्यकता के अनुरूप कोई संयोजन नहीं है, या आपके पास डबल एन्कोडिंग है ।

डबल एन्कोडिंग 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 . थी ।

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

छंटनी . के लिए और प्रश्न चिह्न , डेटा खो गया है।

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

ब्लैक डायमंड्स . के लिए , ...

ठीक करता है यहाँ सूचीबद्ध हैं। (5 अलग-अलग स्थितियों के लिए 5 अलग-अलग सुधार; ध्यान से चुनें):http://mysql. rjweb.org/doc.php/charcoll#fixes_for_various_cases



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आरएचईएल/सेंटोस 8/7 और फेडोरा 35 . पर MySQL 8.0 कैसे स्थापित करें

  2. MAKEDATE () उदाहरण – MySQL

  3. UTF-8 सभी तरह से

  4. MySQL केवल सबसे हाल की पंक्ति में शामिल हों?

  5. MySQL ग्रेट सर्कल डिस्टेंस (हावर्सिन फॉर्मूला)