जब हमने utf8mb4 का उपयोग करके एक VARCHAR (255) क्षेत्र में एक UNIQUE सूचकांक जोड़ने की कोशिश करते समय इस मुद्दे का सामना किया। जबकि समस्या यहाँ पहले से ही रेखांकित है, मैं कुछ व्यावहारिक सलाह जोड़ना चाहता था कि हम इसे कैसे सुलझाते हैं और इसे हल करते हैं।
Utf8mb4 का उपयोग करते समय, वर्ण 4 बाइट्स के रूप में गिने जाते हैं, जबकि utf8 के तहत, वे 3 बाइट्स के रूप में हो सकते हैं। InnoDB डेटाबेस की एक सीमा है कि अनुक्रमित में केवल 767 बाइट्स हो सकते हैं। इसलिए utf8 का उपयोग करते समय, आप 255 वर्ण (767/3 = 255) संग्रहीत कर सकते हैं, लेकिन utf8mb4 का उपयोग करके, आप केवल 191 वर्ण (767/4 = 191) संग्रहीत कर सकते हैं।
आप VARCHAR(255)
utf8mb4 का उपयोग करके फ़ील्ड के लिए नियमित अनुक्रमणिका जोड़ने में पूरी तरह से सक्षम हैं , लेकिन क्या होता है कि अनुक्रमणिका का आकार स्वचालित रूप से 191 वर्णों पर काट दिया जाता है - जैसे unique_key
यहाँ:
यह ठीक है, क्योंकि नियमित रूप से इंडेक्स का उपयोग केवल MySQL को आपके डेटा के माध्यम से और अधिक तेज़ी से खोजने में मदद करने के लिए किया जाता है। पूरे क्षेत्र को अनुक्रमित करने की आवश्यकता नहीं है।
इसलिए, MySQL नियमित अनुक्रमित के लिए स्वचालित रूप से अनुक्रमणिका को छोटा क्यों करता है, लेकिन अद्वितीय अनुक्रमित के लिए यह करने की कोशिश करते समय एक स्पष्ट त्रुटि फेंक देता है? खैर, MySQL के लिए यह पता लगाने में सक्षम होने के लिए कि मूल्य डाला जा रहा है या अपडेट पहले से मौजूद है, इसे वास्तव में पूरे मूल्य को इंडेक्स करने की आवश्यकता है और न केवल इसका हिस्सा।
दिन के अंत में, यदि आप एक क्षेत्र पर एक अद्वितीय सूचकांक रखना चाहते हैं, तो क्षेत्र की संपूर्ण सामग्री को सूचकांक में फिट होना चाहिए। Utf8mb4 के लिए, इसका अर्थ है कि आपके VARCHAR क्षेत्र की लंबाई को 191 वर्ण या उससे कम करना। यदि आपको उस तालिका या फ़ील्ड के लिए utf8mb4 की आवश्यकता नहीं है, तो आप इसे utf8 पर वापस छोड़ सकते हैं और अपने 255 मिलियन फ़ील्ड रख सकते हैं।