মাইএসকিউএলে সমস্ত টেবিলের সমস্ত কলামে চরসেট এবং কোলেশন পরিবর্তন করুন


18

আমার সমস্ত কলামের জন্য সমস্ত টেবিলগুলিতে এই বিবৃতিগুলি কার্যকর করতে হবে।

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

মাইএসকিউএল এর ভিতরে কোনও উপায়ে এটি স্বয়ংক্রিয় করা সম্ভব? আমি 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;

যদি আপনি এর ফলাফলটির সাথে ভাল অনুভব করেন তবে সীমাবদ্ধতাগুলি সরিয়ে ফেলুন এবং একটি এসকিউএল স্ক্রিপ্টে আউটপুটটি সংরক্ষণ করুন বা অভিনব করুন এবং আউটপুটটি সরাসরি এখানে প্রদর্শিত মাইএসকিএলে পাইপ করুন । এটি দেখতে এই রকম হবে:

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

আপনি যখন বৈধ এসকিউএল উত্পন্ন করতে বৈধ এসকিউএল ব্যবহার করার কথা ভাবতে শুরু করেন, এটি পুরো গেমটি পরিবর্তন করে। আপনি এটির জন্য কতগুলি ব্যবহার খুঁজে পান তা দেখে আপনি অবাক হয়ে যাবেন।


প্রায় সেখানে! তবে সিনট্যাক্সটি সঠিকভাবে পেতে পারে না
ডিসিঞ্জিটর

ঠিক আছে আমি পেয়েছি। আমি উত্তরে সঠিক সিনট্যাক্স যুক্ত করছি। আপনার ধারণার নিয়ম
ডিসিঞ্জিটর

4

প্রকৃতপক্ষে, আপনি টেবিলের মধ্যে কনভার্ট টু ব্যবহার করতে পারেন এটি টেবিলের মধ্যে থাকা সমস্ত কলামকে চরসেট এবং কোলেশনে রূপান্তর করতে।

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%';

তারপরে আপনি কোনও এসকিউএল স্ক্রিপ্ট, স্টোর পদ্ধতি বা আপনার পছন্দসই বিকাশের ভাষার সাহায্যে পরিবর্তনটি স্বয়ংক্রিয় করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.