MySQL तालिका के डिफ़ॉल्ट चारसेट को कैसे बदलें?


95

एक MySQL है 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। उसको कैसे करे ?


3
MySQL में "UTF8" का सही नाम "utf8mb4" है "charf" utf8 "टूटा हुआ है, यह केवल 3 बाइट वर्णों का समर्थन करता है। विवरण के लिए mysql मैनुअल देखें, या Google "mysql" और "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
सैमुअल Åslund

जवाबों:


201

यदि आप तालिका default character setऔर सभी वर्ण स्तंभों को एक नए वर्ण सेट में बदलना चाहते हैं , तो इस तरह से एक कथन का उपयोग करें:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

तो क्वेरी होगी:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

22
इसके विपरीत, यदि आप केवल ALTER TABLE tbl CHARACTER SET utf8दूसरों द्वारा सुझाए गए सिंटैक्स का उपयोग करते हैं, तो आप केवल तालिका के लिए डिफ़ॉल्ट एन्कोडिंग को बदल देंगे; यदि आप इस उत्तर का उपयोग करते हैं तो मौजूदा कॉलम को रूपांतरित नहीं किया जाएगा।
eaj

7
यदि आप इस परिवर्तन को उन सभी तालिकाओं के लिए लागू करना चाहते हैं जो डेटाबेस में 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;
परिणामी

3
यह डिफ़ॉल्ट चारसेट को नहीं बदल रहा है । डिफ़ॉल्ट को बदलने के लिए eak के रूप में करते हैंALTER TABLE tbl CHARACTER SET utf8
लेखाकार م

7
मैं यह जोड़ना चाहूंगा कि आमतौर पर आप utf8 का उपयोग नहीं करना चाहते हैं, लेकिन utf8mb4 के बजाय आप क्या utf8 होने की उम्मीद कर सकते हैं। समझाने के लिए: MySQL utf8 में वास्तव में utf8 का एक सबसेट है, जिसे बेहतर utf8mb3 नाम दिया जाएगा। यह केवल निर्दिष्ट 4 बाइट्स के बजाय utf8 वर्णों के 3 बाइट्स तक एन्कोड कर सकता है। इसका मतलब यह है कि कई इमोजी एनकोडेबल नहीं होंगे और बस खो जाएंगे यदि आप उन्हें डीबी में लिखने की कोशिश करेंगे। उदाहरण देखें। जानकारी के लिए medium.com/@adamhooper/…
dwt

6
मल्टीबाइट के लिए आप उपयोग कर सकते हैंALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
आरएन कुशवाहा

18

तालिका का डिफ़ॉल्ट परिवर्तन करें:

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;

10
आपको कभी भी, कभी भी utf8_general_ci का उपयोग नहीं करना चाहिए: यह बस काम नहीं करता है। यह पचास साल पहले के ASCII के बुरे दिनों के पुराने दिनों की बदनामी है। यूसीडी से फोल्डकेस मैप के बिना यूनिकोड केस-असंवेदनशील मिलान नहीं किया जा सकता है। उदाहरण के लिए, "ςος" में तीन अलग-अलग संयोग हैं; या "TSCHüẞ" का निचला भाग "tschü," कैसे है, लेकिन "tschü t" का अपरकेस "TSCHÜSS" है। आप सही हो सकते हैं, या आप तेज हो सकते हैं। इसलिए आपको utf8_unicode_ci का उपयोग करना चाहिए, क्योंकि यदि आप शुद्धता की परवाह नहीं करते हैं, तो यह असीम रूप से तेज़ बनाने के लिए तुच्छ है।
योहन एआई

1
MySQL UTF8 charset टूट गया है, आपको utf8mb4 का उपयोग करने की आवश्यकता है!
शमूएल undslund

5

ALTER TABLEMySQL आदेश चाल करना चाहिए। निम्न आदेश आपकी तालिका के डिफ़ॉल्ट वर्ण सेट और उसके सभी स्तंभों के वर्ण सेट को UTF8 में बदल देगा।

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

यह कमांड टेबल के सभी टेक्स्ट जैसे कॉलम को नए कैरेक्टर सेट में बदल देगा। चरित्र सेट में प्रति वर्ण विभिन्न प्रकार के डेटा का उपयोग किया जाता है, इसलिए MySQL कुछ कॉलम के प्रकार को यह सुनिश्चित करने के लिए रूपांतरित करेगा कि पुराने कॉलम प्रकार के समान वर्णों को फिट करने के लिए पर्याप्त जगह है।

मैं आपको किसी भी लाइव डेटा को संशोधित करने से पहले ALTER TABLE MySQL प्रलेखन को पढ़ने की सलाह देता हूं ।


1
हां, यह चाल करता है, लेकिन कन्वर्ट करने के तरीके के साथ एक चीज अलग है : यह कॉलम से पुराने चार्टसेट विकल्प को स्वचालित रूप से नहीं हटा सकता है।
tech_me

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और इसे MySQL टर्मिनल से कॉल करके निष्पादित करें:

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`;

एक लापता स्थिति है जो हमें विचारों का चयन करने की ओर ले जाती है। यह कहाँ है table_schema = DATABASE (); => जहां टेबल_केम = = डैटबेस () और टेबल_टाइप = 'बेस टेबल'; लेकिन धन्यवाद!! मुझे इसकी ही आवश्यकता थी!
गुयेनहोई 890

2

आप डिफ़ॉल्ट को बदल सकते हैं, alter table set default charsetलेकिन मौजूदा कॉलम के चारसेट को नहीं बदलेगा। यह बदलने के लिए कि आपको एक का उपयोग करने की आवश्यकता है alter table modify column

केवल एक स्तंभ के चारसेट को बदलने का मतलब है कि यह व्यापक श्रेणी के पात्रों को संग्रहीत करने में सक्षम होगा। आपके एप्लिकेशन ने mysql क्लाइंट का उपयोग करते हुए db से बात की ताकि आपको क्लाइंट एन्कोडिंग को भी बदलना पड़े।


अगर यह आइपॉड टच :-) पर सीमित कीबोर्ड के लिए नहीं था, तो मैं
Joni

अच्छी तरह से आइपॉड टच / iPhone में कुछ कमियां होनी चाहिए । :-P को कभी भी एहसास नहीं हुआ कि वे तब तक गायब हैं जब तक कि आप इसका उल्लेख नहीं करते। ;-)
Aufwind

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