MySQL में सभी टेबलों में सभी कॉलमों में परिवर्तन और टकराव


18

मुझे इन कथनों को सभी स्तंभों के लिए सभी तालिकाओं में निष्पादित करने की आवश्यकता है।

alter table table_name charset=utf8;
alter table table_name alter column column_name charset=utf8;

क्या MySQL के अंदर किसी भी तरह से इसे स्वचालित करना संभव है? मैं mysqldump से बचना पसंद करूंगा

अद्यतन: रिचर्ड ब्रोंस्की ने मुझे रास्ता दिखाया :-)

प्रत्येक तालिका में निष्पादित करने के लिए आवश्यक क्वेरी:

alter table DBname.DBfield CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

अन्य सभी प्रश्नों को उत्पन्न करने के लिए पागल क्वेरी:

SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';

मैं केवल इसे एक डेटाबेस में निष्पादित करना चाहता था। सभी को एक पास में निष्पादित करने में बहुत लंबा समय लग रहा था। यह पता चला कि यह प्रति तालिका प्रति फ़ील्ड एक क्वेरी उत्पन्न कर रहा था। और प्रति तालिका केवल एक प्रश्न आवश्यक था (बचाव के लिए अलग)। एक फ़ाइल पर आउटपुट प्राप्त करना यह था कि मैंने इसे कैसे महसूस किया।

फ़ाइल में आउटपुट कैसे उत्पन्न करें:

mysql -B -N --user=user --password=secret -e "SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';" > alter.sql

और अंत में सभी प्रश्नों को निष्पादित करने के लिए:

mysql --user=user --password=secret < alter.sql

धन्यवाद रिचर्ड। आप ही है वह आदमी!

जवाबों:


16

सबसे पहले, बस इसके लिए मेरे शब्द मत लो! इसके साथ मेरे सुझाव का परीक्षण करें:

select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema' limit 10; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema' limit 10;

यदि आप इसके परिणाम के साथ अच्छा महसूस करते हैं, तो सीमा क्लॉस को हटा दें और आउटपुट को SQL स्क्रिप्ट में सहेजें या, फैंसी प्राप्त करें और आउटपुट को सीधे mysql में पाइप करें जो मैं यहां प्रदर्शित करता हूं । यह इस तरह दिखेगा:

mysql -B -N --host=prod-db1 --user=admin --password=secret -e "select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema'; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema';" | mysql --host=prod-db1 --user=admin --password=secret

जब आप मान्य SQL उत्पन्न करने के लिए वैध SQL का उपयोग करने के बारे में सोचना शुरू करते हैं, तो यह पूरे खेल को बदल देता है। आप इससे चकित होंगे कि आप इसके लिए कितने उपयोग पाते हैं।


लगभग वहाँ पहुँच गया! लेकिन वाक्यविन्यास सही नहीं मिल सकता है
डिसेंट्रीगेटर

ठीक है, मैं समझ गया। मैं उत्तर के लिए सही सिंटैक्स जोड़ रहा हूं। आपका विचार नियम
डिसइन्टेग्रेटर

4

दरअसल, आप टेबल पर CONVERT TO का उपयोग कर सकते हैं ताकि यह उस तालिका के सभी कॉलम को चारसेट और कोलाज में परिवर्तित कर सके।

SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'databasename';

इसके अलावा, यह मेरे लिए उस वास्तविक डेटाबेस का चयन करने के लिए अधिक समझ में आता है जो आप ऐसा करना चाहते हैं। तो यह:

... WHERE TABLE_SCHEMA = 'databasename';

इसके बजाय:

... WHERE TABLE_SCHEMA != 'information_schema';

लेकिन मुझे लगता है कि यदि आप वास्तव में इसे सभी तालिकाओं पर करना चाहते हैं, तो आप पूर्व का उपयोग कर सकते हैं। हालांकि मुझे थोड़ा भारी लगता है। :)


1

मेरे द्वारा उपयोग किए गए सभी स्तंभों पर टकराव को बदलने के लिए

SELECT CONCAT(  'ALTER TABLE ',  `TABLE_NAME` ,  ' CHANGE `',  `COLUMN_NAME` ,  '` `',`COLUMN_NAME` ,  '` ',  `DATA_TYPE` ,  '(',  `CHARACTER_MAXIMUM_LENGTH` ,  ') CHARACTER SET utf8 COLLATE utf8_swedish_ci ;' ) FROM  `COLUMNS` WHERE  `TABLE_SCHEMA` =  <schema> AND  `COLLATION_NAME` !=  'utf8_swedish_ci' ORDER BY  `TABLE_NAME` ,  `ORDINAL_POSITION` ;

0

आप information_schemaउस स्तंभ और तालिका को खोजने के लिए डेटाबेस का उपयोग कर सकते हैं जिसे आपको बदलना है। आप उन्हें पा सकते हैं:

SELECT table_name, column_name FROM information_schema.`COLUMNS`
WHERE table_schema='your database' AND collation_name LIKE 'latin%';

फिर आप SQL स्क्रिप्ट, स्टोर प्रक्रिया या अपनी पसंदीदा विकास भाषा के साथ परिवर्तन को स्वचालित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.