मेरे पास एक समाधान है जो कुछ कमांड चलाकर डेटाबेस और तालिकाओं को बदल देगा। यह भी प्रकार के सभी स्तंभों धर्मान्तरित varchar
, text
, tinytext
, mediumtext
, longtext
, char
। कुछ टूटने की स्थिति में आपको अपने डेटाबेस का बैकअप भी लेना चाहिए ।
निम्नलिखित कोड को एक फ़ाइल में कॉपी करें जिसे इसे preAlterTables.sql कहा जाता है:
use information_schema;
SELECT concat("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like "yourDbName" group by table_schema;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like "yourDbName" group by table_schema, table_name;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like "yourDbName" and data_type in ('varchar','char');
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like "yourDbName" and data_type in ('text','tinytext','mediumtext','longtext');
"YourDbName" की सभी घटनाओं को उस डेटाबेस से बदलें, जिसे आप कनवर्ट करना चाहते हैं। तो भागो:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
यह एक नई फ़ाइल को बदल देगा ।Tables.sql, डेटाबेस को बदलने के लिए आवश्यक सभी प्रश्नों के साथ। रूपांतरण शुरू करने के लिए निम्नलिखित कमांड चलाएँ:
mysql -uroot < alterTables.sql
आप कई डेटाबेस के माध्यम से चलाने के लिए इसे अनुकूलित कर सकते हैं, table_schema के लिए स्थिति बदलकर। उदाहरण के लिए table_schema like "wiki_%"
उपसर्ग नाम के साथ सभी डेटाबेसों को परिवर्तित करेगा wiki_
। सभी डेटाबेस को बदलने के लिए शर्त को बदलें table_type!='SYSTEM VIEW'
।
एक मुद्दा जो उत्पन्न हो सकता है। मेरे mysql कुंजियों में कुछ varchar (255) कॉलम थे। यह एक त्रुटि का कारण बनता है:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
यदि ऐसा होता है, तो आप वर्कर को छोटा करने के लिए बदल सकते हैं, जैसे कि varchar (150), और कमांड को फिर से चलाएँ।
कृपया ध्यान दें : यह उत्तर प्रश्न में पूछे गए के utf8mb4_unicode_ci
बजाय डेटाबेस को रूपांतरित करता है utf8mb4_bin
। लेकिन आप बस इसे बदल सकते हैं।
mysql -uroot -pThatrootPassWord < alterTables.sql
काम करता है। और जैसा कि आपने पहले ही नोट किया था, utf8mb4_bin क्या है, दूसरों के बीच में, नेक्लाउड अनुशंसा करता है।