একটি মাইএসকিউএল টেবিলের ডিফল্ট চরসেটটি কীভাবে পরিবর্তন করবেন?


100

একটি মাইএসকিউএল রয়েছে tableযা থেকে এই সংজ্ঞাটি নেওয়া হয়েছে SQLYog Enterprise:

Table              Create Table                                             
-----------------  ---------------------------------------------------------
etape_prospection  CREATE TABLE `etape_prospection` (                       
                     `etape_prosp_id` int(10) NOT NULL AUTO_INCREMENT,      
                     `type_prosp_id` int(10) NOT NULL DEFAULT '0',          
                     `prosp_id` int(10) NOT NULL DEFAULT '0',               
                     `etape_prosp_date` datetime DEFAULT NULL,              
                     `etape_prosp_comment` text,                            
                     PRIMARY KEY (`etape_prosp_id`),                        
                     KEY `concerne_fk` (`prosp_id`),                        
                     KEY `de_type_fk` (`type_prosp_id`)                     
                   ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1  

আমি পরিবর্তন করতে চান default charsetথেকে এই টেবিলের latin1কাছে utf8। কিভাবে যে কি ?


4
মাইএসকিউএলে "ইউটিএফ 8" এর সঠিক নামটি "utf8mb4" "চরসেট" utf8 "নষ্ট হয়ে গেছে, এটি কেবল 3 টি বাইট অক্ষর সমর্থন করে। বিশদগুলির জন্য মাইএসকিএল
স্যামুয়েল

উত্তর:


210

আপনি যদি টেবিল default character setএবং সমস্ত অক্ষর কলামগুলিকে একটি নতুন চরিত্রের সেটটিতে পরিবর্তন করতে চান তবে এই জাতীয় বিবৃতি ব্যবহার করুন:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

সুতরাং ক্যোয়ারীটি হ'ল:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

23
বিপরীতে, যদি আপনি ALTER TABLE tbl CHARACTER SET utf8অন্যদের পরামর্শ মতো বাক্য গঠন ব্যবহার করেন তবে আপনি কেবল টেবিলের জন্য ডিফল্ট এনকোডিং পরিবর্তন করতে পারবেন; আপনি যদি এই উত্তরটি ব্যবহার করেন তবে বিদ্যমান কলামগুলি সে হিসাবে রূপান্তরিত হবে না।
ইজ

8
আপনি যদি কোনও ডাটাবেসে ut8 এ এনকোড না থাকা সমস্ত টেবিলের জন্য এই পরিবর্তনটি প্রয়োগ করতে চান তবে আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন এবং ফলাফলগুলি অনুসন্ধান করতে পারেন: SELECT concat('alter table ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.tables WHERE table_schema='<your_database_name>' and table_collation != 'utf8_general_ci' GROUP BY table_name;
ম্যাকসো

4
এটি ডিফল্ট অক্ষরেখা পরিবর্তন করছে না । পূর্বনির্ধারিত রূপটি পরিবর্তন করতে যেমন ইক বলেছেনALTER TABLE tbl CHARACTER SET utf8
হিসাবরক্ষক

7
আমি যুক্ত করতে চাই যে আপনি সাধারণত utf8 ব্যবহার করতে চান না তবে আপনি utf8 হতে পারে এমনটি পেতে utf8mb4 ব্যবহার করতে চান। ব্যাখ্যা করার জন্য: মাইএসকিউএল ইউটিএফ 8 আসলে ইউটিএফ 8 এর কেবলমাত্র একটি উপসেট, যার নামটি আরও ভালভাবে utf8mb3 রাখা হবে। এটি নির্দিষ্ট করা 4 টি বাইটের পরিবর্তে utf8 টি অক্ষরের কেবল 3 বাইট পর্যন্ত এনকোড করতে পারে। এর অর্থ হ'ল অনেক ইমোজি এনকোডযোগ্য হবে না এবং আপনি যদি ডিবিতে লেখার চেষ্টা করেন তবে তা হারিয়ে যাবে। যেমন দেখুন। বিস্তারিত জানার জন্য মিডিয়াম . com/@adamhooper/…
DWT

7
মাল্টিবাইটের জন্য আপনি ব্যবহার করতে পারেনALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
আরএন কুশওয়াহা

19

সারণীর ডিফল্ট চরসেট পরিবর্তন করুন:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

স্ট্রিং কলাম অক্ষরটি পরিবর্তন করতে এই ক্যোয়ারীটি ছাড়িয়ে যান:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;

12
আপনার কখনই utf8_general_ci ব্যবহার করা উচিত নয়: এটি কেবল কার্যকর হয় না। পঞ্চাশ বছর আগে থেকে ASCII বোকামির খারাপ পুরানো দিনগুলিতে এটি থ্রোকব্যাক। ইউসিডি থেকে ফোল্ডকেস মানচিত্র ছাড়া ইউনিকোড কেস-সংবেদনশীল ম্যাচিং করা যাবে না। উদাহরণস্বরূপ, "Σίσυφος" এর মধ্যে তিনটি ভিন্ন সিগমাস রয়েছে; বা "টিএসসিএইচএ" এর ছোট হাতের অক্ষরটি কীভাবে "tschüβ", তবে "tschüβ" এর বড় হাতের অক্ষরটি "TSCHÜSS"। আপনি সঠিক হতে পারেন, বা আপনি দ্রুত হতে পারেন। অতএব আপনাকে অবশ্যই utf8_unicode_ci ব্যবহার করতে হবে, কারণ আপনি যদি সঠিকতার বিষয়ে চিন্তা করেন না, তবে এটিকে অসীম দ্রুততর করা তুচ্ছ।
যোহানেস এআই

4
মাইএসকিউএল ইউটিএফ 8 চরসেটটি ভেঙে গেছে, আপনাকে utf8mb4 ব্যবহার করতে হবে!
স্যামুয়েল -স্লুন্ড

5

ALTER TABLEমাইএসকিউএল কমান্ড কৌতুক করতে হবে। নিম্নলিখিত কমান্ডটি আপনার টেবিলের ডিফল্ট অক্ষর সেট এবং এর সমস্ত কলামের অক্ষর সেটটি ইউটিএফ 8 এ পরিবর্তন করবে।

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

এই কমান্ডটি টেবিলের সমস্ত পাঠ্য-মতো কলামগুলিকে নতুন অক্ষর সেটকে রূপান্তর করবে। অক্ষর সেটগুলি প্রতিটি চরিত্রের জন্য বিভিন্ন পরিমাণের ডেটা ব্যবহার করে, তাই মাইএসকিউএল কিছু কলামের প্রকারকে রূপান্তর করবে যাতে পুরনো কলামের ধরণের মতো একই সংখ্যক অক্ষরের ফিট করার জন্য যথেষ্ট জায়গা থাকে।

আমি আপনাকে প্রস্তাব দিচ্ছি যে কোনও লাইভ ডেটা সংশোধন করার আগে অল্টার টেবিল মাইএসকিউএল ডকুমেন্টেশনটি পড়ুন


4
হ্যাঁ, এটি কৌশলটি করে না, তবে রূপান্তর করার পথে একটি জিনিস আলাদা : এটি কলামগুলি থেকে স্বয়ংক্রিয়ভাবে পুরানো চারসেট বিকল্পটি সরাতে পারে না।
টেক_মে

3

যদি কেউ সমস্ত ডাটাবেস টেবিলের জন্য ডিফল্ট চরসেট পরিবর্তন করতে এবং ডেটা রূপান্তর করতে একটি সম্পূর্ণ সমাধান সন্ধান করে তবে এটি এক হতে পারে:

DELIMITER $$

CREATE PROCEDURE `exec_query`(IN sql_text VARCHAR(255))
BEGIN
  SET @tquery = `sql_text`;
  PREPARE `stmt` FROM @tquery;
  EXECUTE `stmt`;
  DEALLOCATE PREPARE `stmt`;
END$$

CREATE PROCEDURE `change_character_set`(IN `charset` VARCHAR(64), IN `collation` VARCHAR(64))
BEGIN
DECLARE `done` BOOLEAN DEFAULT FALSE;
DECLARE `tab_name` VARCHAR(64);
DECLARE `charset_cursor` CURSOR FOR 
    SELECT `table_name` FROM `information_schema`.`tables`
    WHERE `table_schema` = DATABASE() AND `table_type` = 'BASE TABLE';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = TRUE;

SET foreign_key_checks = 0;
OPEN `charset_cursor`;
`change_loop`: LOOP
FETCH `charset_cursor` INTO `tab_name`;
IF `done` THEN
    LEAVE `change_loop`;
END IF;
CALL `exec_query`(CONCAT(
  'ALTER TABLE `',
  tab_name,
  '` CONVERT TO CHARACTER SET ',
  QUOTE(charset),
  ' COLLATE ',
  QUOTE(collation),
  ';'
));
CALL `exec_query`(CONCAT('REPAIR TABLE `', tab_name, '`;'));
CALL `exec_query`(CONCAT('OPTIMIZE TABLE `', tab_name, '`;'));
END LOOP `change_loop`;
CLOSE `charset_cursor`;
SET foreign_key_checks = 1;
END$$

DELIMITER ;

আপনি এই কোডটি ফাইলের মধ্যে রাখতে পারেন উদাহরণস্বরূপ chg_char_set.sqlএবং এটি কার্যকর করতে পারেন যেমন মাইএসকিউএল টার্মিনাল থেকে কল করে:

SOURCE ~/path-to-the-file/chg_char_set.sql

তারপরে পছন্দসই ইনপুট পরামিতিগুলির সাথে সংজ্ঞায়িত পদ্ধতিটি কল করুন

CALL change_character_set('utf8mb4', 'utf8mb4_bin');

একবার আপনি ফলাফলগুলি পরীক্ষা করে নেওয়ার পরে, আপনি এই সঞ্চিত পদ্ধতিগুলি ফেলে দিতে পারেন:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;

একটি অনুপস্থিত শর্ত রয়েছে যা আমাদের দর্শনগুলি নির্বাচন করতেও পরিচালিত করে। এটি হ'ল টেবিল_স্কেমা = ডেটাবেস (); => যেখানে টেবিল_শেমি = ডেটাবেস () এবং টেবিল_ টাইপ = 'বেস টেবিলে'; কিন্তু ধন্যবাদ!! এটাই আমার দরকার!
nguyenhoai890

2

আপনি একটি দিয়ে ডিফল্ট পরিবর্তন করতে পারেন alter table set default charsetতবে এটি বিদ্যমান কলামগুলির অক্ষর পরিবর্তন করবে না। এটি পরিবর্তন করতে আপনার একটি ব্যবহার করা দরকার alter table modify column

একটি কলামের চরসেট পরিবর্তন করার অর্থ কেবল এটি বৃহত্তর অক্ষর সংরক্ষণ করতে সক্ষম হবে। আপনার অ্যাপ্লিকেশনটি মাইএসকিএল ক্লায়েন্ট ব্যবহার করে ডিবিতে কথা বলে যাতে আপনার ক্লায়েন্টের এনকোডিংও পরিবর্তন করতে পারে।


আমি যদি এটি আইপডের সীমাবদ্ধ কীবোর্ডটির জন্য না থাকি :-)
জনি

ভাল আইপড টাচ / আইফোন আবশ্যক আছে কিছু অপূর্ণতা। :- পি কখনই বুঝতে পারেনি যে আপনি উল্লেখ না করা পর্যন্ত তারা অনুপস্থিত। ;-)
অউফউইন্ড

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