डेविड व्हिटकर ने जो पोस्ट किया है, उसे जोड़कर, मैंने एक ऐसी क्वेरी बनाई है जो संपूर्ण तालिका और कॉलम को बदल देती है जो प्रत्येक टेबल को बदल देगा। इसे चलाना एक अच्छा विचार हो सकता है
SET SIONION group_concat_max_len = 100000;
यह सुनिश्चित करने के लिए कि आपका समूह कॉनैट बहुत छोटी सीमा से अधिक नहीं है जैसा कि यहां देखा गया है ।
SELECT a.table_name, concat('ALTER TABLE ', a.table_schema, '.', a.table_name, ' DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci, ',
group_concat(distinct(concat(' MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ', if (is_nullable = 'NO', ' NOT', ''), ' NULL ',
if (COLUMN_DEFAULT is not null, CONCAT(' DEFAULT \'', COLUMN_DEFAULT, '\''), ''), if (EXTRA != '', CONCAT(' ', EXTRA), '')))), ';') as alter_statement
FROM information_schema.columns a
INNER JOIN INFORMATION_SCHEMA.TABLES b ON a.TABLE_CATALOG = b.TABLE_CATALOG
AND a.TABLE_SCHEMA = b.TABLE_SCHEMA
AND a.TABLE_NAME = b.TABLE_NAME
AND b.table_type != 'view'
WHERE a.table_schema = ? and (collation_name = 'latin1_swedish_ci' or collation_name = 'utf8mb4_general_ci')
GROUP BY table_name;
पिछले उत्तर के बीच एक अंतर यह है कि वह ut8mb4 के बजाय utf8 का उपयोग कर रहा था और t1.data_type का उपयोग करके t1.CHARACTER_MAXIMUM_LENGTH के लिए काम नहीं किया। साथ ही, मेरी क्वेरी विचारों को बाहर करती है, क्योंकि उन्हें अलग से बदलना होगा।
मैंने केवल एक सरणी के रूप में इन सभी अलर्ट को वापस करने के लिए एक पर्ल स्क्रिप्ट का उपयोग किया और उन पर पुनरावृत्त किया, उन स्तंभों को तय किया जो बहुत लंबे थे (आम तौर पर वे varchar (256) थे जब डेटा में आम तौर पर केवल 20 वर्ण होते थे ताकि यह एक आसान फिक्स था )।
मैंने पाया कि लैटिन 1 से परिवर्तन करते समय कुछ डेटा दूषित हो गया था -> utf8mb4। यह प्रतीत होता है कि utf8 स्तंभों में लैटिन 1 वर्णों को कूटबद्ध किया गया है जो रूपांतरण में नासमझ हो जाएगा। मैं बस उन कॉलमों से डेटा रखता था जिन्हें मैं जानता था कि पहले और बाद में परिवर्तन से स्मृति में एक मुद्दा बनने जा रहा था और उनकी तुलना की और डेटा को ठीक करने के लिए अपडेट स्टेटमेंट तैयार किए।