- इंडेक्स के आकार की सीमाएं हैं। आप सीमा से टकरा गए क्योंकि utf8mb4 को 4 बाइट्स . तक की आवश्यकता है प्रति चरित्र , जहां utf8 को केवल 3 की आवश्यकता है। इस बीच INDEX आकार सीमा बाइट्स में है ।
'समाधान' यह तय करना है कि बड़े आकार के सूचकांक के बारे में क्या करना है। (अधिक नीचे)
2.
ALTER TABLE t CHANGE col col ...
अधिक तार्किक के समान है
ALTER TABLE t MODIFY col ...
पूर्व आपको कॉलम का नाम बदलने की अनुमति देता है, इसलिए जब आपको नाम बदलने की आवश्यकता नहीं होती है तो कॉलम नाम की दो प्रतियां होती हैं।
-
काफी संभावना है कि आपके पास
VARCHAR(255)
. था जो utf8 में 767 बाइट्स लेता है (3*255+2; "2" लंबाई क्षेत्र का आकार है)। 4-बाइट utf8mb4 में समतुल्य होगा (191) (4*191+2=766; 191 से अधिक के लिए जगह नहीं)। -
मैंने इसके बारे में एक लेख नहीं देखा है। मुझे संदेह है कि मैंने अभी जो कहा है, वह सबसे अधिक कहने की जरूरत है।
तो...
योजना ए :क्या आपके पास foo VARCHAR(255)
है और यह utf8 था? क्या इसमें डेटा हमेशा (अभी और भविष्य में) 191 वर्णों से छोटा होता है? अगर ऐसा है, तो बस ALTER करें।
योजना बी :यदि आपको 191 से अधिक की आवश्यकता है, तो क्या आपको वास्तव में INDEX की आवश्यकता है? ड्रॉप इंडेक्स एक विकल्प हो सकता है।
योजना सी :या, आप "उपसर्ग" अनुक्रमणिका का उपयोग कर सकते हैं:INDEX(foo(191))
, इसे छोड़ते समय VARCHAR(255)
. आमतौर पर "उपसर्ग" इंडेक्स बेकार होते हैं, लेकिन आप हो सकता है एक उपयोग मामला है जिसके लिए यह काम करता है।
इस पर आगे चर्चा करने के लिए, कृपया SHOW CREATE TABLE
provide प्रदान करें विचाराधीन तालिका के लिए, और उस विशेष क्षेत्र और उसके INDEX के अर्थ पर चर्चा करें।