UTF-8: सामान्य? बिन? यूनिकोड?


279

मैं यह पता लगाने की कोशिश कर रहा हूं कि विभिन्न प्रकार के डेटा के लिए मुझे किस कॉलेशन का उपयोग करना चाहिए। मेरे द्वारा संग्रहित सामग्री का 100% उपयोगकर्ता द्वारा प्रस्तुत किया जाता है।

मेरी समझ यह है कि मुझे UTF-8 बाइनरी के बजाय UTF-8 जनरल CI (केस-असंवेदनशील) का उपयोग करना चाहिए। हालाँकि, मुझे UTF-8 जनरल CI और UTF-8 यूनिकोड CI के बीच एक स्पष्ट अंतर नहीं मिल रहा है।

  1. क्या मुझे यूटीएफ -8 जनरल या यूटीएफ -8 यूनिकोड सीआई कॉलम में उपयोगकर्ता द्वारा प्रस्तुत सामग्री संग्रहीत करनी चाहिए?
  2. UTF-8 बाइनरी किस प्रकार के डेटा पर लागू होगा?

16
साइड नोट लेकिन इसके बजाय, पूर्ण UTF-8 समर्थन के लिए utf8उपयोग करें utf8mb4। यहाँ टिप्पणी करना क्योंकि इस लोकप्रिय प्रश्न के उत्तर इसे संबोधित नहीं करते हैं। mathiasbynens.be/notes/mysql-utf8mb4
स्टीवन आर। लूमिस

यदि आप केस फोल्डिंग, लेकिन एक्सेंट सेंसिटिविटी चाहते हैं, तो कृपया bugs.mysql.com पर एक अनुरोध दर्ज करें
रिक जेम्स

या Bugs.mysql.com/bug.php?id=58797 पर "मुझे प्रभावित करता है" पर क्लिक करें और एक टिप्पणी जोड़ें।
रिक जेम्स

जवाबों:


299

सामान्य तौर पर, utf8_general_ci utf8_unicode_ci की तुलना में तेज़ है , लेकिन कम सही है।

यहाँ अंतर है:

किसी भी यूनिकोड वर्ण सेट के लिए, _general_ci collation का उपयोग करके किए गए ऑपरेशन _unicode_ci टकराव की तुलना में तेज़ होते हैं । उदाहरण के लिए, utf8_general_ci collation के लिए तुलनाएं तेज़ हैं, लेकिन utf8_unicode_ci की तुलना में थोड़ी कम सही हैं। इसका कारण यह है कि utf8_unicode_ci विस्तार जैसे मैपिंग का समर्थन करता है; वह है, जब एक वर्ण अन्य वर्णों के संयोजन के बराबर होता है। उदाहरण के लिए, जर्मन और कुछ अन्य भाषाओं में "," "ss" के बराबर है। utf8_unicode_ci भी संकुचन और आग्नेय वर्णों का समर्थन करता है। utf8_general_ci एक विरासत टकराव है जो विस्तार, संकुचन या अज्ञानतापूर्ण पात्रों का समर्थन नहीं करता है। यह पात्रों के बीच केवल एक-से-एक तुलना कर सकता है।

से उद्धृत: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

अधिक विस्तृत विवरण के लिए, कृपया MySQL फ़ोरम की निम्नलिखित पोस्ट पढ़ें: http://forums.mysql.com/read.php?103,187048,188748

Utf8_bin के लिए: दोनों utf8_general_ci और utf8_unicode_ci केस-असंवेदनशील तुलना करते हैं। इसके विपरीत , utf8_bin केस-संवेदी है (अन्य अंतरों के बीच), क्योंकि यह वर्णों के द्विआधारी मूल्यों की तुलना करता है।


2
मुझे लगता है कि यदि आपके पास _unicode_ci का उपयोग करने का एक अच्छा कारण नहीं है, तो _general_ci का उपयोग करें।
सागी

4
यह वास्तव में हालांकि गहराई से सवाल का जवाब नहीं देता है। इन टकरावों के बीच वास्तव में क्या अंतर है?
पेक्का

4
आप सही हैं, सादगी के लिए सटीक अंतर यहाँ प्रदान नहीं किया गया है। मैंने सटीक अंतर के साथ एक पोस्ट का लिंक जोड़ा है ।
सागी

एनबी show collation;आपको प्रत्येक वर्ण सेट के लिए डिफ़ॉल्ट टकराव देखने की अनुमति देता है। 5.1 utf8_general_ciडिफ़ॉल्ट के रूप में दिखाता है utf8
डेविड कार्बोनी

9
क्या ऐसे कोई संसाधन हैं जो दो टकरावों के बीच वास्तविक गति अंतर में अधिक गहराई तक जाएंगे? क्या हम प्रदर्शन में 0.1% की गिरावट या 10% की गिरावट के बारे में बात कर रहे हैं?
इम्फ्राम स्टवान्गर

90

आपको इस तथ्य के बारे में भी पता होना चाहिए कि utf8_general_ci के साथ जब एक varchar फ़ील्ड का उपयोग करते हुए अद्वितीय या प्राथमिक सूचकांक के रूप में 'मान' और 'á' जैसे 2 मान सम्मिलित करते हैं, तो डुप्लिकेट कुंजी त्रुटि होगी।


3
धन्यवाद, यह समान उपयोगकर्ता नाम से बचने के लिए उपयोगी है (उदाहरण के लिए यदि "जोस" मौजूद है, तो मैं नहीं चाहूंगा कि कोई और व्यक्ति "जोस" उपयोगकर्ता बनाए) NB: यह utf8 कोलाजेशन (utf8 -bin को छोड़कर) के लिए भी सही है। सबसे सुरक्षित / सबसे सुरक्षित / सबसे व्यापक हैutf8_unicode_ci
कोस्टा

2
मैं utf8_bin का उपयोग करता हूं जहां मैं चाहता हूं कि इंडेक्स में प्रतिष्ठित और जोस को अलग किया जाए। उदाहरण के लिए, एक कॉलम जो खोज को संचालित / प्रतिस्थापित करता है, जहां उपयोगकर्ता ने josé की खोज करने का निर्णय लिया है, और इसे jose से प्रतिस्थापित कर सकता है। (मैं एक स्प्रेडशीट प्रोग्राम लिख रहा हूँ)
बटलर बटुक

33
  • utf8_binबिट्स की तुलना आँख बंद करके करता है। कोई मामला तह, कोई उच्चारण अलग करना।
  • utf8_general_ciएक बाइट के साथ एक बाइट की तुलना करता है। यह केस फोल्डिंग और एक्सेंट स्ट्रिपिंग करता है, लेकिन कोई 2-कैरेक्टर तुलना ijनहीं करता है : ijइस कॉलेशन में समान नहीं है ।
  • utf8_*_ciभाषा-विशिष्ट नियमों का एक सेट है, लेकिन अन्यथा पसंद है unicode_ci। कुछ विशेष मामलों: Ç, Č, ch,ll
  • utf8_unicode_ciतुलना के लिए एक पुराने यूनिकोड मानक का अनुसरण करता है। ij= ij, लेकिन ae! =æ
  • utf8_unicode_520_ciएक नए यूनिकोड मानक का अनुसरण करता है। ae=æ

विभिन्न utf8 collations में क्या समान है पर विवरण के लिए कोलाज चार्ट देखें ।

utf8, जैसा कि MySQL द्वारा परिभाषित 1-1-बाइट utf8 कोड तक सीमित है। इससे इमोजी और कुछ चीनी निकल जाते हैं। utf8mb4यदि आप यूरोप से बहुत आगे जाना चाहते हैं तो आपको वास्तव में स्विच करना चाहिए ।

उपरोक्त बिंदु utf8mb4उपयुक्त वर्तनी परिवर्तन के बाद लागू होते हैं। आगे जा रहे हैं, utf8mb4और utf8mb4_unicode_520_ciपसंद कर रहे हैं।

  • utf16 और utf32 utf8 पर वेरिएंट हैं; वस्तुतः उनके लिए कोई उपयोग नहीं है।
  • ucs2 "utf8" की तुलना में "यूनिकोड" के करीब है; वस्तुतः इसका कोई उपयोग नहीं है।

1
रे "बने रहिए": 8.0 collations शो कैसे विभिन्न पात्रों, diphthongs, आदि, 8.0 utf8mb4 collations में तुलना; utf8 ज्यादातर एक ही है।
रिक जेम्स

और 8.0 टकराव 5.x की तुलना में काफी तेज गति से देखे जाते हैं।
रिक जेम्स

यह अच्छा होगा यदि वह पृष्ठ शीर्ष पर utf8mb4_bin को सूचीबद्ध करता है। मुझे पता है कि यह कोई चरित्र बिल्कुल मेल नहीं खाता है, लेकिन यह newbies के लिए अच्छा है।
हेनक पोली

6

वास्तव में, मैंने अद्वितीय सूचकांक के साथ कॉलम में 'é' और 'e' जैसे बचत मूल्यों का परीक्षण किया और वे 'utf8_unicode_ci' और 'utf8_general_ci' दोनों पर डुप्लिकेट त्रुटि का कारण बने। आप उन्हें केवल 'utf8_bin' कोलाज किए गए कॉलम में सहेज सकते हैं।

और mysql डॉक्स ( http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html में ) इसके उदाहरणों में 'utf8_general_ci' कोलाज सेट करने का सुझाव देते हैं।

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

1
मैंने इस पर एक त्वरित परीक्षण किया, और यह सटीक प्रतीत होता है। जब दोनों स्तंभों पर एक अनूठी कुंजी आती है और टिल्ड और इस तरह के मूल्यों के साथ दोनों टकराव एक ही व्यवहार करते हैं।
मिररफाइंड

@MirroredFate ठीक है, मुझे वहां जोड़ना चाहिए कि इस त्रुटि के कारण स्तंभ के पास अद्वितीय सूचकांक होना चाहिए। इसका मतलब मेरे जवाब में है।
महत्वपूर्ण जूल

3

स्वीकृत उत्तर पुराना है।

यदि आप MySQL 5.5.3+ का उपयोग utf8mb4_unicode_ciकरते हैं, utf8_unicode_ciतो यह सुनिश्चित करने के बजाय कि आपके उपयोगकर्ता द्वारा टाइप किए गए वर्णों को सुनिश्चित करने के लिए उपयोग करें, आपको त्रुटियां नहीं देंगे।

utf8mb4उदाहरण के लिए इमोजी का समर्थन करता है, जबकि utf8आपको सैकड़ों एन्कोडिंग-संबंधित बग जैसे दे सकता है:

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1


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