डेटाबेस latin1_general_ci
अब है और मैं कोलाजेशन को बदलना चाहता हूं utf8mb4_general_ci
।
क्या PhpMyAdmin में डेटाबेस, टेबल, कॉलम के कोलाजेशन को बदलने के लिए कोई सेटिंग है? एक-एक करके बदलने के बजाय?
डेटाबेस latin1_general_ci
अब है और मैं कोलाजेशन को बदलना चाहता हूं utf8mb4_general_ci
।
क्या PhpMyAdmin में डेटाबेस, टेबल, कॉलम के कोलाजेशन को बदलने के लिए कोई सेटिंग है? एक-एक करके बदलने के बजाय?
जवाबों:
आपको प्रत्येक तालिका को व्यक्तिगत रूप से बदलने की आवश्यकता है:
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4
(यह कॉलम को भी रूपांतरित करेगा), या डेटाबेस को इसके साथ latin1
आयात करें और इसे वापस आयात करें utf8mb4
।
@rsensan
: CONVERT
कॉलम के टकराने को भी बदल देगा।
database
DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
MYTABLE
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci को बदल दें; कृपया utf8_general_ci का अब उपयोग न करें ;-)
मैं यहाँ योगदान कर रहा हूँ, जैसा कि ओपी ने पूछा:
डेटाबेस, टेबल, कॉलम के कोलाजेशन को कैसे बदलें?
चयनित उत्तर इसे तालिका स्तर पर बताता है।
इसे डेटाबेस में व्यापक परिवर्तन:
ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
इसे प्रति तालिका में बदलना:
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
अच्छा अभ्यास यह है कि इसे टेबल स्तर पर बदल दिया जाए क्योंकि यह इसे कॉलम के लिए भी बदल देगा। विशिष्ट कॉलम के लिए बदलना किसी भी विशिष्ट मामले के लिए है।
एक विशिष्ट कॉलम के लिए कोलाज बदलना:
ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
आप एक php स्क्रिप्ट चला सकते हैं।
<?php
$con = mysql_connect('localhost','user','password');
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db('dbname');
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $value) {
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
}}
echo "The collation of your database has been successfully changed!";
?>
आपके द्वारा उपयोग की जा सकने वाली तालिकाओं के लिए कोलाज बदलने के लिए,
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8
पूरे डेटाबेस के लिए डिफ़ॉल्ट कोलाजेशन सेट करने के लिए,
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
वरना,
गोटो PhpMyAdmin-> संचालन-> कोलालेशन।
वहां आपको कुछ चुनिंदा बॉक्स मिलते हैं, जिसमें सभी एक्साइटिंग कोलाज होते हैं। ताकि यहां आप अपना कोलाज बदल सकें। इसलिए जब आप नया कॉलम बना रहे हैं, तो डेटाबेस तालिका के बाद इस टकराव का अनुसरण किया जाएगा। नए कॉलम बनाते समय चयनित कॉलेशन की कोई आवश्यकता नहीं है।
निम्न क्वेरी ALTER क्वेरीज़ उत्पन्न करेगी जो सभी तालिकाओं में सभी उचित स्तंभों के लिए एक निश्चित प्रकार (utf8_general_ci नीचे मेरे उदाहरण में) के लिए परिवर्तन को बदल देती है।
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.data_type,
'(' ,
CHARACTER_MAXIMUM_LENGTH,
')',
' CHARACTER SET utf8 COLLATE utf8_general_ci;'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'you_db_name_goes_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');
information_schema.tables
ALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
अगर आप phpMyAdmin >> Select डेटाबेस >> Select तालिका >> "संचालन" टैब >> "Table विकल्प" अनुभाग में जाते हैं, तो >> आप ड्रॉप डाउन सूची से Collation चुन सकते हैं >> और एक बार जब आप {Go} को दबाएं स्क्रीन के ऊपर आपको एक संदेश दिखाई देगा:
आपकी SQL क्वेरी को सफलतापूर्वक निष्पादित किया गया है
और एक स्क्रिप्ट
ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
लेकिन यह मौजूदा स्तंभों के टकराव को नहीं बदलेगा। ऐसा करने के लिए आप इस स्क्रिप्ट का उपयोग कर सकते हैं (यह भी phpMyAdmin से आया है)
ALTER TABLE `tableName` CHANGE `Name` `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
आप कई स्तरों पर डिफ़ॉल्ट टकराव सेट कर सकते हैं:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1) क्लाइंट 2) सर्वर डिफॉल्ट 3) डेटाबेस डिफॉल्ट 4) टेबल डिफॉल्ट 5) कॉलम
सभी डेटाबेस तालिकाओं को एक ही बार में बदलने के लिए बस इस SQL को चलाएँ। अपनी आवश्यकता के अनुसार अपना COLLATION और डेटाबेस नाम बदलें।
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE utf8_general_ci;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="databaseName"
AND TABLE_TYPE="BASE TABLE";
आप निम्नानुसार PHP स्क्रिप्ट के माध्यम से अपने सभी तालिकाओं के चार्ट और संकलन को बदल सकते हैं। मुझे हकेसरा का उत्तर पसंद है लेकिन इसके साथ समस्या यह है कि क्वेरी प्रत्येक तालिका पर दो बार चलती है। यह कोड mysql के बजाय MySqli का उपयोग करने और दोहरे क्वेरी को रोकने के अलावा लगभग समान है। अगर मैं वोट कर सकता था, तो मैंने हेकसेरा के जवाब को वोट दिया।
<?php
$conn1=new MySQLi("localhost","user","password","database");
if($conn1->connect_errno){
echo mysqli_connect_error();
exit;
}
$res=$conn1->query("show tables") or die($conn1->error);
while($tables=$res->fetch_array()){
$conn1->query("ALTER TABLE $tables[0] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") or die($conn1->error);
}
echo "The collation of your database has been successfully changed!";
$res->free();
$conn1->close();
?>
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
:।
आप इस कोड को स्क्रिप्ट फ़ाइल में जोड़ सकते हैं
//Database Connection
$host = 'localhost';
$db_name = 'your_database_name';
$db_user = 'your_database_user_name';
$db_pass = 'your_database_user_password';
$con = mysql_connect($host,$db_user,$db_pass);
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db($db_name);
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $value) {
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
}
}
echo "The collation of your database has been successfully changed!";
मुझे यह जानकर आश्चर्य हुआ, और इसलिए मुझे यहां वापस आना पड़ा और रिपोर्ट करना पड़ा, कि उत्कृष्ट और अच्छी तरह से बनाए रखा इंटरकनेक्ट / इसे सेफ सेर्च और रिप्लाई ऑन डेटा स्क्रिप्ट के पास तालिकाओं को utf8 / unodeode में परिवर्तित करने के लिए कुछ विकल्प हैं, और यहां तक कि निर्दोष में बदलने के लिए भी। । यह आमतौर पर एक डेटाबेस संचालित वेबसाइट (Wordpress, Drupal, Joomla, आदि) को एक डोमेन से दूसरे डोमेन पर माइग्रेट करने के लिए उपयोग की जाने वाली स्क्रिप्ट है।
मैंने इसे यहां पढ़ा है, कि आपको प्रत्येक तालिका को मैन्युअल रूप से परिवर्तित करने की आवश्यकता है, यह सच नहीं है। यहाँ एक समाधान है कि इसे कैसे संग्रहीत प्रक्रिया से किया जाए:
DELIMITER $$
DROP PROCEDURE IF EXISTS changeCollation$$
-- character_set parameter could be 'utf8'
-- or 'latin1' or any other valid character set
CREATE PROCEDURE changeCollation(IN character_set VARCHAR(255))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_table_name varchar(255) DEFAULT "";
DECLARE v_message varchar(4000) DEFAULT "No records";
-- This will create a cursor that selects each table,
-- where the character set is not the one
-- that is defined in the parameter
DECLARE alter_cursor CURSOR FOR SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND COLLATION_NAME NOT LIKE CONCAT(character_set, '_%');
-- This handler will set the value v_finished to 1
-- if there are no more rows
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;
OPEN alter_cursor;
-- Start a loop to fetch each rows from the cursor
get_table: LOOP
-- Fetch the table names one by one
FETCH alter_cursor INTO v_table_name;
-- If there is no more record, then we have to skip
-- the commands inside the loop
IF v_finished = 1 THEN
LEAVE get_table;
END IF;
IF v_table_name != '' THEN
IF v_message = 'No records' THEN
SET v_message = '';
END IF;
-- This technic makes the trick, it prepares a statement
-- that is based on the v_table_name parameter and it means
-- that this one is different by each iteration inside the loop
SET @s = CONCAT('ALTER TABLE ',v_table_name,
' CONVERT TO CHARACTER SET ', character_set);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET v_message = CONCAT('The table ', v_table_name ,
' was changed to the default collation of ', character_set,
'.\n', v_message);
SET v_table_name = '';
END IF;
-- Close the loop and the cursor
END LOOP get_table;
CLOSE alter_cursor;
-- Returns information about the altered tables or 'No records'
SELECT v_message;
END $$
DELIMITER ;
प्रक्रिया बनने के बाद इसे सीधे कॉल करें:
CALL changeCollation('utf8');
अधिक जानकारी के लिए इस ब्लॉग को पढ़ें ।
यदि आप स्कीमा पर डिफ़ॉल्ट चारसेट अपडेट करना चाहते हैं:
ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
मैंने निम्नलिखित शेल स्क्रिप्ट का उपयोग किया। यह डेटाबेस के नाम को एक पैरामीटर के रूप में लेता है और सभी तालिकाओं को दूसरे चार्टसेट और कॉलेशन (किसी अन्य पैरामीटर द्वारा दिए गए या स्क्रिप्ट में परिभाषित डिफ़ॉल्ट मान) में परिवर्तित करता है।
#!/bin/bash
# mycollate.sh <database> [<charset> <collation>]
# changes MySQL/MariaDB charset and collation for one database - all tables and
# all columns in all tables
DB="$1"
CHARSET="$2"
COLL="$3"
[ -n "$DB" ] || exit 1
[ -n "$CHARSET" ] || CHARSET="utf8mb4"
[ -n "$COLL" ] || COLL="utf8mb4_general_ci"
echo $DB
echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql
echo "USE $DB; SHOW TABLES;" | mysql -s | (
while read TABLE; do
echo $DB.$TABLE
echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql $DB
done
)
मेरा समाधान @Dzintars और @Quassnoi उत्तर का एक संयोजन है।
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 ;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="<your-database>"
AND TABLE_TYPE="BASE TABLE";
उपयोग करके CONVERT TO
, यह एक स्क्रिप्ट उत्पन्न करता है, जो <your-database>
आपके अनुरोधित एन्कोडिंग के सभी टेबल्स को परिवर्तित करता है । इससे हर कॉलम की एन्कोडिंग भी बदल जाती है !
SQL अनुरोध द्वारा SQL स्क्रिप्ट उत्पन्न करने के लिए बेहतर संस्करण। यह चूक / अशांति को नष्ट नहीं करेगा।
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.column_type,
' CHARACTER SET utf8 COLLATE utf8_general_ci',
if(t1.is_nullable='YES', ' NULL', ' NOT NULL'),
if(t1.column_default is not null, concat(' DEFAULT \'', t1.column_default, '\''), ''),
';'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'your_table_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');
त्वरित तरीका - एसक्यूएल फ़ाइल को निर्यात करें, आपको जिस पाठ को बदलने की आवश्यकता है उसे बदलने के लिए खोज और बदलें का उपयोग करें। नया डेटाबेस बनाएँ, डेटा आयात करें और फिर पुराने डेटाबेस और पुराने नाम के लिए नया नाम बदलें।
एक बार में एक डेटाबेस के सभी तालिकाओं में सभी क्षेत्रों के टकराव को बदलने के लिए:
मैं सिर्फ उल्लेख से पहले Php के माध्यम से समाधान के लिए तालिकाओं के भीतर खेतों के लिए एक और लूप जोड़ रहा था। इससे मदद मिली है, तालिकाओं के सभी फ़ील्ड भी रूपांतरित हो गए हैं।
<?php
$con = mysql_connect('localhost','user','pw');
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db('database_name');
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $table) { // for each table
$sql = "ALTER TABLE $table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
echo "\n".$sql;
mysql_query($sql);
$sql = "show fields in ".$table." where type like 'varchar%' or type like 'char%' or type='text' or type='mediumtext';";
$rs2=mysql_query($sql);
while( $rw2 = mysql_fetch_array($rs2) ){ // for each field in table
$sql = "ALTER TABLE `".$table."` CHANGE `".$rw2['Field']."` `".$rw2['Field']."` ".$rw2['Type']." CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;";
echo "\n".$sql;
mysql_query($sql);
}
}
}
echo "The collation of your database has been successfully changed!";
?>}
मैंने किसी दिए गए डेटाबेस में सभी तालिकाओं को खोजने और उन्हें (और उसके स्तंभों) को गुप्त करने के लिए बस बैश स्क्रिप्ट लिखी है।
स्क्रिप्ट यहां उपलब्ध है: https://github.com/Juddling/mysql-charset