कैसे एक पूरे MySQL डेटाबेस वर्ण और संघनक UTF-8 में परिवर्तित करने के लिए?


459

मैं पूरे MySQL डेटाबेस कैरेक्टर-सेट को UTF-8 और UTF-8 से कैसे बदल सकता हूं?


22
बाद के आगंतुकों के लिए: साइडबार में संबंधित प्रश्नों पर ध्यान दें और उपयोग करें utf8_unicode_ci, नहीं utf8_general_ci
fuxia

14
आप पूर्ण UTF-8 समर्थन चाहते हैं तो आप शायद यह भी की एक वर्ण सेट का उपयोग करना चाहेंगे utf8mb4के बजाय utf8के रूप में utf8केवल बुनियादी बहुभाषी विमान के रूप में पूरी श्रृंखला के लिए विरोध का समर्थन करता है। इसके लिए MySQL 5.5.3 या उससे ऊपर की आवश्यकता है।
मार्टिन स्टील

4
मैं ऊपर अपनी टिप्पणी में उल्लेख करना भूल गया, यदि आप स्विच करते हैं utf8mb4तो आपको कोलाज को भी स्विच करना होगाutf8mb4_unicode_ci
मार्टिन स्टील

3
इससे भी बेहतर, टक्कर utf8mb4_unicode_520_ci, या जो भी नवीनतम उपलब्ध संस्करण है।
जेम्स में रिक जेम्स

@MartinSteel मेरा मानना ​​है कि उस चरित्र सेट के साथ डिफ़ॉल्ट रूप से टकराव है।
VaTo

जवाबों:


715

का प्रयोग करें ALTER DATABASEऔर ALTER TABLEआदेशों।

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

या यदि आप अभी भी MySQL 5.5.2 या इससे अधिक पुराने हैं, जो 4-बाइट UTF-8 का समर्थन नहीं करते, तो utf8इसके बजाय उपयोग करें utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

12
CONVERT TOतकनीक मानता है कि पाठ किया गया था सही ढंग से कुछ अन्य चारसेट में जमा हो जाती है (जैसे, latin1), और (जैसे UTF-8 बाइट्स latin1 करने के लिए रूपांतरण के बिना latin1 स्तंभ में crammed के रूप में) घायल नहीं।
रिक जेम्स

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

@ और बड़े उत्पादन प्रणालियों के रखरखाव के लिए आमतौर पर एक प्रतिबिंबित DB होता है।
बालुसक

1
utf8 को बदलने के लिए सेट charcter पाठ से माध्यम के लिए मेरे डेटाटाइप को बदलता है। क्या यह अपेक्षित है?
जेरी

1
@ जेरी शायद, चूंकि: "यदि स्तंभ को utf8 में बदल दिया जाता है, तो प्रत्येक वर्ण को तीन बाइट तक की आवश्यकता हो सकती है, अधिकतम संभव लंबाई के लिए 3 × 65,535 = 196,605 बाइट्स। वह लंबाई एक टी 20 कॉलम की लंबाई बाइट्स में फिट नहीं होती है। MySQL डेटा प्रकार को MEDIUMTEXT में परिवर्तित करता है, जो सबसे छोटा स्ट्रिंग प्रकार है जिसके लिए लंबाई बाइट्स 196,605 का मान रिकॉर्ड कर सकता है। इसी तरह, VARCHAR कॉलम को MEDIUMTEXT में परिवर्तित किया जा सकता है। " कैरेक्टर सेट को बदलना
17

129
  1. एक बैकअप बनाओ!

  2. फिर आपको डेटाबेस पर डिफ़ॉल्ट चार सेट सेट करने की आवश्यकता है। यह मौजूदा तालिकाओं को परिवर्तित नहीं करता है, यह केवल नए बनाए गए तालिकाओं के लिए डिफ़ॉल्ट सेट करता है।

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. फिर, आपको सभी मौजूदा तालिकाओं और उनके स्तंभों पर सेट को बदलने की आवश्यकता होगी। यह मानता है कि आपका वर्तमान डेटा वास्तव में वर्तमान चार सेट में है। यदि आपके कॉलम एक चार सेट पर सेट हैं, लेकिन आपका डेटा वास्तव में दूसरे में संग्रहीत है, तो आपको इसे संभालने के लिए MySQL मैनुअल की जांच करनी होगी ।

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

44
नोट: सारणी सारणी सारणी सेट utf8 केवल एक तालिका पर डिफ़ॉल्ट चार सेट सेट करता है जो नए बनाए गए स्तंभों के लिए उपयोग किया जाता है। यह मौजूदा स्तंभों को परिवर्तित नहीं करता है जो पहले से ही एक चार सेट सेट है।
newspire

मुझे बैकअप बैकअप बैकअप पहले पढ़ना चाहिए था ... लेकिन मेरी किस्मत यह थी कि यह विकास के माहौल पर था। इसलिए मेरा उत्थान तुम्हारे पास जाता है!
डोमिनिकनअगर

4
@DominikAngerer: क्या टूट गया?
cic

16
ध्यान दें कि utf8_general_ciअब अनुशंसित सर्वोत्तम अभ्यास नहीं है। MySQL 5.5.3 के utf8mb4बजाय आपको इसका उपयोग करना चाहिए utf8। वे दोनों UTF-8 एन्कोडिंग का उल्लेख करते हैं, लेकिन पुराने utf8में एक MySQL-विशिष्ट सीमा थी जो ऊपर गिने पात्रों का उपयोग रोकती थी 0xFFFD
u01jmg3

76

कमांडलाइन शेल पर

यदि आप कमांडलाइन शेल में से एक हैं, तो आप यह बहुत जल्दी कर सकते हैं। बस "dbname" भरें: डी

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

साधारण कॉपी / पेस्ट के लिए वन-लाइनर

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

2
क्या आप इसमें अधिक विवरण डाल सकते हैंERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
स्टेरोस

@ 4485670 आपको इसे कमांड लाइन शेल पर चलाने की आवश्यकता है । यदि आपके पास केवल MySQL क्लाइंट कनेक्शन उपलब्ध है, तो नीचे sdfor के कोड का उपयोग करें।
अर्नोल्ड डेनियल

6
यह कोड बहुत अच्छा काम करता है, बस आवश्यक के रूप में mysql के बाद -h [hostname] -u [उपयोगकर्ता नाम] -p [पासवर्ड] जोड़ना याद रखें।
फैलाने

3
आप शायद एक असली सिस्टम पर विदेशी कुंजी जांच को अक्षम करना चाहते हैं: DB="db_name"; ( echo 'ALTER DATABASE '' $ DB '' 'CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql - uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I {} गूंज 'SET विदेशी_की_चेक = 0; '{}'वैकल्पिक तालिका को बदलने के लिए utf8 COLLATE utf8_general_ci; ) | mysql-Luser -ppassword -hhost "$ DB" `
एडम नेल्सन

1
मेरे लिए तब तक काम नहीं किया जब तक मैंने "पूर्ण तालिकाएँ नहीं दिखाईं" जहाँ "तालिकाएँ = 'आधार तालिका" के बजाय "SHOW TABLES"
ब्रायन पीटरसन

68

आप सभी तालिकाओं को अपडेट करने के लिए sql बना सकते हैं:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

आउटपुट कैप्चर करें और इसे चलाएं।

ऊपर अर्नोल्ड डेनियल का जवाब अधिक सुरुचिपूर्ण है।


आपने दो परिवर्तन तालिका क्वेरी क्यों जोड़ी? एक पर्याप्त नहीं है?
अक्षय

7
@ अक्षय, अच्छा सवाल। पहली परिवर्तन-तालिका क्वेरी नए स्तंभों के लिए डिफ़ॉल्ट सेट करती है, और दूसरी परिवर्तन-तालिका क्वेरी मौजूदा स्तंभों को परिवर्तित करती है।
अनलिमिटेड

4
FYI करें: dev.mysql.com/doc/refman/5.5/en/alter-table.html MySQL डॉक्यूमेंट के अनुसार , ALTER स्टेटमेंट का "CONVERT TO CHARACTER SET" वर्जन दोनों एक ही स्टेप में करते हैं: टेबल डिफॉल्ट को बदलने के लिए चरित्र सेट और सभी चरित्र स्तंभ (CHAR, VARCHAR, पाठ) एक नए चरित्र सेट के लिए ...
devGuy

2
मैं यह त्रुटि # 1054 है - 'जहां खंड' में अज्ञात स्तंभ 'webdb_playground' लेकिन मुझे यकीन है कि मेरी db सही एक है कर रहा हूँ
Yannis Dran

1
@YannisDran आपका db नाम एक स्ट्रिंग में नहीं हो सकता है, जैसे कि WHERE TABLE_SCHEMA=webdb_playgroundआपने अज्ञात कॉलम त्रुटि दी थी, लेकिन WHERE TABLE_SCHEMA="webdb_playground"सफल रही होगी। मामले में किसी और की कोशिश करने के लिए कुछ और कि में चलाता है।
जब्बासस्क्रिप्ट

17

आगे बढ़ने से पहले, सुनिश्चित करें कि आपने: पूरा डेटाबेस बैकअप लिया है!

चरण 1: डेटाबेस स्तर में परिवर्तन

  • अपने डेटाबेस के Collation और कैरेक्टर सेट की पहचान करना

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
  • डेटाबेस के लिए कोलाज को ठीक करना

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

चरण 2: तालिका स्तर में परिवर्तन

  • गलत चरित्र सेट या टकराव के साथ डेटाबेस टेबल्स की पहचान करना

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
  • तालिका स्तंभों का कोलाज और वर्ण सेट समायोजित करना

ऊपरी sql आउटपुट कैप्चर करें और इसे चलाएं। (निम्नलिखित की तरह)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

इसका संदर्भ लें: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Datasia


1
वर्तमान में यह स्क्रिप्ट db के लिए 'utf8_unicode_ci' का उपयोग करती है, लेकिन तालिकाओं के लिए 'utf8_general_ci' - क्या वह जानबूझकर था? (मुझे लगता है कि दोनों को एक ही चारसेट का उपयोग करना चाहिए)
gmcnaughton

stackoverflow.com/questions/10957238/… यहाँ फुलर उत्तर छोड़ दिया है
VH

8

HeidiSQL का उपयोग करें । इसका फ्री और एक बहुत अच्छा db टूल है।

उपकरण मेनू से, बल्क टेबल संपादक दर्ज करें

पूरा डेटाबेस चुनें या तालिकाएँ चुनें,

  • डिफ़ॉल्ट परिवर्तन को टिक करें: utf8mb4_general_ci
  • टिक को charset में बदलें: utf8

निष्पादित

यह कुछ ही सेकंड में लैटिन से utf8 तक पूर्ण डेटाबेस को रूपांतरित करता है।

एक जादू की तरह काम करता है :)

HeidiSQL डिफ़ॉल्ट रूप से utf8 के रूप में जोड़ता है इसलिए किसी भी विशेष वर्ण को अब चरित्र (SQL ø å) के रूप में देखा जाना चाहिए और तालिका डेटा का निरीक्षण करते समय एन्कोडेड नहीं होना चाहिए।

लैटिन से utf8 की ओर बढ़ने पर असली नुकसान यह सुनिश्चित करना है कि pdo utf8 charset से जुड़ता है। यदि आप अपने वेब पेज पर सभी जगह utf8 टेबल और प्रश्न चिह्न के लिए रबड डेटा नहीं डालेंगे, तो आपको लगता है कि टेबल डेटा utf8 नहीं है ...


क्या आप कृपया विस्तार से बता सकते हैं? मेरे पास वास्तव में यह मुद्दा है - विशेष वर्ण और स्थान प्रश्न चिह्न के रूप में दिखाई देते हैं। मैं PHP में PHPMyAdmin का उपयोग कर डेटाबेस को बदलने की कोशिश कर रहा हूं। ऑफ़लाइन विकसित होने के बाद, मुझे पता चला कि मेरा होस्ट utf8mb4 का समर्थन नहीं करता है। मेरे पास विंडोज नहीं है इसलिए HeidiSQL का उपयोग नहीं कर सकता। वहाँ एक रास्ता है मैं PHPMyAdmin के साथ इसे प्राप्त कर सकता है?
15

इस तरह। विशेष रूप से आपके पास बहुत टेबल है।
तान

जब CHARSET: SQL Error (1025): नाम बदलने की कोशिश कर रहा हूं, तो मुझे त्रुटि मिलती है ... लेकिन यह एक अद्भुत SQL प्रबंधक उपकरण है!
marcolopes

अगर किसी को भी हेइडीस्केल के लिए एक अच्छे अवलोकन और ट्यूटोरियल की आवश्यकता है, तो इस लेख को देखें
डग बी

6

@Sdfor टिप्पणी से प्रेरित होकर, यहाँ एक bash स्क्रिप्ट है जो काम करती है

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit

4

यदि डेटा समान वर्ण सेट में नहीं है, तो आप इस स्निपेट पर http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html से विचार कर सकते हैं

यदि कॉलम में एक नॉनबाइनेटरी डेटा टाइप (CHAR, VARCHAR, TEXT) है, तो इसकी सामग्री को कॉलम कैरेक्टर सेट में एनकोड किया जाना चाहिए, न कि कुछ अन्य कैरेक्टर सेट में। यदि सामग्री को किसी भिन्न वर्ण सेट में एन्कोड किया गया है, तो आप पहले द्विआधारी डेटा प्रकार का उपयोग करने के लिए स्तंभ को परिवर्तित कर सकते हैं, और फिर वांछित चरित्र सेट के साथ एक गैर-स्तंभ पर कॉलम कर सकते हैं।

यहाँ एक उदाहरण है:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

सही कॉलेशन चुनना सुनिश्चित करें, या आपको अद्वितीय कुंजी विरोध मिल सकता है। उदाहरण के लिए egleanore और Eleanore को कुछ टकरावों में समान माना जा सकता है।

एक तरफ:

मेरे पास एक ऐसी स्थिति थी जहां कुछ वर्ण ईमेल में "टूट गए" थे, भले ही वे डेटाबेस में यूटीएफ -8 के रूप में संग्रहीत थे। यदि आप utf8 डेटा का उपयोग करके ईमेल भेज रहे हैं, तो आप UTF8 में भेजने के लिए अपने ईमेल भी परिवर्तित कर सकते हैं।

PHPMailer में, बस इस लाइन को अपडेट करें: public $CharSet = 'utf-8';


4

उन डेटाबेस के लिए जिनमें तालिकाओं की एक उच्च संख्या है, आप डेटाबेस का उपयोग करने के लिए एक साधारण php स्क्रिप्ट का उपयोग कर सकते हैं और निम्नलिखित का उपयोग करके सभी तालिकाओं को देख सकते हैं:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}

इस लिपि को हम कहां से चलाते हैं?
यनीस ड्रान

1
@YannisDran यह बात नहीं होनी चाहिए, जब तक कि आपके द्वारा इसे क्रियान्वित करने वाले आईपी का डेटाबेस तक पहुँच न हो। सुनिश्चित करें कि आप पहले बैकअप लें!
दान लुकास

अच्छा, और हम इसे कैसे चलाते हैं? क्या हमें इसे सर्वर पर अपलोड करना है और फिर इसकी स्थिति में पथ दर्ज करना है?
यनीस ड्रान

4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();

धन्यवाद, यह उन कुछ उत्तरों में से एक है जो वास्तव में यह दिखाते हैं कि इसे पूरे डेटाबेस (यानी प्रत्येक तालिका) में कैसे किया जाए। एक जादू की तरह काम किया।
माकिसुजी

3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

3

सबसे सुरक्षित तरीका है कि कॉलम को पहले बाइनरी टाइप में संशोधित किया जाए और फिर वांछित वर्णसेट का उपयोग करके इसे वापस टाइप किया जाए।

प्रत्येक कॉलम प्रकार के अपने संबंधित द्विआधारी प्रकार निम्नानुसार हैं:

  1. चार => द्विवर्षीय
  2. TEXT => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. वर्कर => वार्बिनरी

उदाहरण के लिए .:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

मैंने कई लेट 1 टेबलों में कोशिश की और इसने सभी डिक्टिटिक्स को रखा।

आप ऐसा करने वाले सभी कॉलम के लिए यह क्वेरी निकाल सकते हैं:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

आपके द्वारा अपने सभी स्तंभों पर ऐसा करने के बाद आप इसे सभी तालिकाओं पर करते हैं:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

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

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

और अब जब आपने अपने सभी स्तंभों और तालिकाओं को संशोधित किया, तो डेटाबेस पर भी ऐसा ही करें:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

1

यदि आपको अपनी तालिकाएँ परिवर्तित करने के लिए नहीं मिल सकती हैं या आपकी तालिका हमेशा कुछ गैर-utf8 वर्ण सेट पर सेट है, लेकिन आप utf8 चाहते हैं, तो आपका सबसे अच्छा शर्त यह हो सकता है कि इसे मिटा दें और फिर से शुरू करें और स्पष्ट रूप से निर्दिष्ट करें:

create database database_name character set utf8;

0

मेरे लिए काम करने वाला एकमात्र समाधान: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

तालिकाओं वाले डेटाबेस को परिवर्तित करना

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

0

परिवर्तन तालिका table_name charset = 'utf8';

यह एक साधारण क्वेरी है जो मैं अपने मामले के लिए उपयोग करने में सक्षम था, आप अपनी आवश्यकता के अनुसार तालिका_नाम बदल सकते हैं।


आम तौर पर एक जवाब के साथ कुछ स्पष्टीकरण के साथ होना चाहिए कि आप क्या कर रहे हैं।
रिग्सफॉली

0

डेटाबेस के लिए UTF-8 में वर्ण सेट एन्कोडिंग को बदलने के लिए, mysql> प्रॉम्प्ट पर निम्न कमांड टाइप करें। डेटाबेस नाम के साथ DBNAME बदलें:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

0

आप DB टूल Navicat भी कर सकते हैं, जो इसे और अधिक आसान बनाता है।

  • शिव।

अपने डेटाबेस पर राइट क्लिक करें और ड्रॉप डाउन में वांछित DB गुण और परिवर्तन चुनें

यहाँ छवि विवरण दर्ज करें


0

कमांड लाइन सॉल्यूशन और एक्सक्लूसिव व्यूज

मैं दूसरों की तरह बस @ जस्सी का जवाब पूरा कर @Brianरहा हूं और मेरे डेटाबेस में मेरे विचार हैं।

यदि आपके पास इस तरह की त्रुटि है:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

ऐसा इसलिए है क्योंकि आपके पास संभवतः विचार हैं और आपको उन्हें बाहर करने की आवश्यकता है। लेकिन जब उन्हें बाहर करने की कोशिश की जा रही है, तो MySQL 1 के बजाय 2 कॉलम देता है।

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

इसलिए हमें awkकेवल 1 कॉलम जिसमें तालिका का नाम है, निकालने के लिए जैनी की कमांड को अनुकूलित करना होगा ।

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

साधारण कॉपी / पेस्ट के लिए वन-लाइनर

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

-1

UTF-8 में वर्ण सेट एन्कोडिंग को बदलने के लिए PHPMyAdmin में सरल चरणों का पालन करें

  1. अपने डेटाबेस का चयन करें एसएस

  2. ऑपरेशन के लिए जाओ एसएस

  3. ऑपरेशन टैब में, नीचे के कोलेशन ड्रॉप डाउन मेनू पर, आप इच्छा एन्कोडिंग का चयन करें (utf8_general_ci), और चेकबॉक्स को भी चेक करें (1) सभी टेबल कोलाज को बदल दें, (2) सभी टेबल कॉलम परिवर्तन को बदलें। और जाओ मारो।

एसएस

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