কীভাবে ডাটাবেস, টেবিল, কলামের জোট পরিবর্তন করবেন?


200

ডাটাবেস হল latin1_general_ci এখন এবং আমি কোলেশনে পরিবর্তন করতে চাই utf8mb4_general_ci

পিএইচপিএমআইএডমিনে ডেটাবেস, টেবিল, কলামের জোট পরিবর্তন করার জন্য কি কোনও সেটিং আছে? একের পর এক বদলে?


3
উত্তরের জন্য এটি দেখুন: স্ট্যাকওভারফ্লো
টিমো হুভিনেন

উত্তর:


257

আপনি প্রতিটি টেবিলে স্বতন্ত্রভাবে রূপান্তর করতে হবে:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 

(এটি কলামগুলিকে ঠিক তেমনি রূপান্তরিতও করবে), বা এর সাথে ডাটাবেস রফতানি করে latin1এটিকে আবার আমদানি করবে utf8mb4


15
তবে আমি কলামের জোট পরিবর্তন করতে চাই। এটি কেবল টেবিলের
জোট

7
@rsensan: CONVERTপাশাপাশি কলামগুলির জোট পরিবর্তন করবে।
কাসনোই

21
ALTER স্কিমা database ডিফল্ট ক্যারেক্টার সেট UTF8 ডিফল্ট ক্রমসজ্জিত utf8_general_ci;
10-10

8
@ স্টর্মওয়াইল্ড: এটি বিদ্যমান সারণীগুলিকে প্রভাবিত করবে না
কাসনসুই

47
আমার ক্যোয়ারী: MYTABLEচরিত্র নির্ধারণের টেবিল কনভার্টটি সেট করুন utf8mb4 কল করুন utf8mb4_unicode_ci; দয়া করে আর utf8_general_ci ব্যবহার করবেন না ;-)
কাপাইটাইন উইটবার্ড

209

ওপি যেমন বলেছে আমি এখানে অবদান রাখছি:

কীভাবে ডাটাবেস, টেবিল, কলামের জোট পরিবর্তন করবেন?

নির্বাচিত উত্তরটি কেবল এটিকে টেবিল স্তরে উল্লেখ করে।


এটি ডাটাবেস প্রশস্তভাবে পরিবর্তন করা:

ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

এটি প্রতি টেবিল পরিবর্তন করা:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ভাল অনুশীলন হ'ল এটি টেবিল স্তরে পরিবর্তন করা যেমন এটি এটি কলামগুলির জন্যও পরিবর্তন করবে। নির্দিষ্ট কলামের জন্য পরিবর্তন কোনও নির্দিষ্ট ক্ষেত্রে any

একটি নির্দিষ্ট কলামের জন্য কোলেশন পরিবর্তন করা হচ্ছে:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

15
এটি আসলে প্রশ্নের সরাসরি উত্তর দেয়। আমার এটি দরকার ছিল, কারণ আমার টেবিল-স্তরের পরিবর্তনগুলি কলামগুলি আপডেট করে নি। আমি পরে এটি তদন্ত করব; তবে এটি সেই তথ্য যা আমাকে কঠিন সময়গুলির মধ্যে পেয়েছিল। ধন্যবাদ।
প্যারাপলুই

9
এই জন্য সেরা উত্তর।
jubi4dition

হ্যাঁ, আপনার কলামের ধরণের বৈশিষ্ট্য থাকতে হবে। সমস্ত ধরণের পেতে এখানে একটি যাদু আদেশ রয়েছে। মাল্টি-লাইন এডিটিং ব্যবহার করে আপনি একবারে এখানে শুরু করে সমস্ত কলামগুলি আপডেট করার জন্য কমান্ড তৈরি করতে পারেন: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');
উইলিয়াম এন্টারিকেন

একটি একক কলামের জন্য আপনি কেবল এটি করতে পারেন: টেবিলের টেবিল_নাম পরিবর্তন করুন কলাম_নাম পরিবর্তন করুন (45) কল করুন utf8mb4_bin;
টোমিমহা

68

আপনি পিএইচপি স্ক্রিপ্ট চালাতে পারেন।

               <?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!";
                ?>

43

টেবিলগুলির জন্য স্বতন্ত্রভাবে স্বতন্ত্র পরিবর্তন ব্যবহার করতে পারেন,

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8

পুরো ডাটাবেসের জন্য ডিফল্ট কোলেশন সেট করতে,

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

অথবা,

যান পিএইচপিএমআইএডমিন-> অপারেশনস>> কোলেশন।

সেখানে আপনি একটি নির্বাচিত বাক্স খুঁজে পাবেন যাতে সমস্ত বহির্মুখী কলেজগুলি রয়েছে। যাতে আপনি এখানে আপনার জোট পরিবর্তন করতে পারেন। সুতরাং এখানে ডাটাবেস সারণির পরে এই কোলেশন অনুসরণ করবে যখন আপনি নতুন কলাম তৈরি করবেন। নতুন কলাম তৈরি করার সময় নির্বাচিত কোলেশনের প্রয়োজন নেই।


অনেক অনেক ধন্যবাদ, এটি সহায়ক ছিল
JoZ3

15

নিম্নলিখিত কোয়েরিটি 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');

+1 আমি এই উত্তরটি সবচেয়ে পছন্দ করি। প্রত্যেকেরই কোথাও কোথাও পিএইচপি নেই। কিছু কিছু মাইএসকিউএল সহ অন্যান্য ভাষা ব্যবহার করে। এটি মাইএসকিউএল ওয়ার্কবেঞ্চে চালানো সহজ ছিল, সারিগুলি অনুলিপি করুন এবং পেস্ট করুন। information_schema.tablesউপরেরটির জন্য কোডটি চালানোর জন্য আমি কেবলমাত্র অতিরিক্ত পদক্ষেপটি করেছি এবং কোডটি কনকমেটে করেছিALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
পিয়েরে

1
এটি (মাঝারি / দীর্ঘ) পাঠ্য কলামের ধরণের
প্রবন্ধগুলি

11

আপনি যদি phpMyAdmin চালান >> ডাটাবেস নির্বাচন করুন >> টেবিল নির্বাচন করুন >> "টেবিল অপশন" বিভাগে "অপারেশনস" ট্যাবে >> আপনি ড্রপ ডাউন তালিকা থেকে কোলেশন চয়ন করতে পারেন >> এবং একবার আপনি "Go" চাপলে পর্দার শীর্ষে আপনি একটি বার্তা দেখতে পাবেন:

আপনার এসকিউএল কোয়েরি সফলভাবে কার্যকর করা হয়েছে

এবং একটি স্ক্রিপ্ট

ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

তবে এটি বিদ্যমান কলামগুলির জোটগুলি পরিবর্তন করবে না। এটি করতে আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন (এটি পিএইচপিএমআইএডমিন থেকেও এসেছে)

ALTER TABLE  `tableName` CHANGE  `Name`  `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL


5

একবারে সমস্ত ডাটাবেস টেবিল রূপান্তর করতে এই এসকিউএল চালান। আপনার প্রয়োজনীয়তা এবং আপনার ডাটাবেস নাম পরিবর্তন করুন।

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

4

আপনি পিএইচপি স্ক্রিপ্টের মাধ্যমে আপনার সমস্ত টেবিলের চিয়ারসেট এবং কলেজ পরিবর্তন করতে পারেন। আমি হ্যাকাসেরের উত্তরটি পছন্দ করি তবে এটির সাথে সমস্যাটি হ'ল প্রতিটি টেবিলে ক্যোরির দু'বার চলে। এই কোডটি মাইএসকিএল পরিবর্তে মাইএসকিলি ব্যবহার করা এবং ডাবল জিজ্ঞাসা প্রতিরোধ ব্যতীত প্রায় একই রকম। আমি যদি ভোট দিতে পারতাম, তবে আমি হ্যাকাসেরের উত্তরটি দিয়েছিলাম।

<?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();

?>

এটি আমার জন্য পুরোপুরি কাজ করেন, Zabbix 5. শুধু আপগ্রেড পর যে আমি পরিবর্তিত বলতে charset এবং কোলেশন ভালো: CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
robe007

4

আপনি এই কোডটি সহজে স্ক্রিপ্ট ফাইলটিতে যুক্ত করতে পারেন

//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!";

4

আমি জানতে পেরে অবাক হয়েছিলাম, এবং তাই আমাকে এখানে ফিরে এসে রিপোর্ট করতে হয়েছিল যে দুর্দান্ত এবং ভালভাবে রক্ষণাবেক্ষণ করা আন্তঃসংযোগ / এটি নিরাপদ অনুসন্ধান এবং ডেটাবেসের স্ক্রিপ্টের পরিবর্তে টেবিলগুলিকে utf8 / ইউনিকোডে রূপান্তর করার জন্য এবং এমনকি ইনডোডবিতে রূপান্তর করার জন্য কিছু বিকল্প রয়েছে । এটি একটি স্ক্রিপ্ট যা সাধারণত একটি ডোমেন থেকে অন্য ডোমেইনে ডাটাবেস চালিত ওয়েবসাইট (ওয়ার্ডপ্রেস, দ্রুপাল, জুমলা ইত্যাদি) স্থানান্তর করতে ব্যবহৃত হয়।

আন্তঃসংযোগ স্ক্রিপ্ট বোতাম


3

আমি এটি এখানে পড়েছি, আপনার প্রতিটি টেবিলটি ম্যানুয়ালি রূপান্তর করা দরকার, এটি সত্য নয়। সঞ্চিত পদ্ধতিতে এটি কীভাবে করবেন তা এখানে একটি সমাধান:

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

আরও তথ্যের জন্য এই ব্লগ পড়ুন



1

আমি নিম্নলিখিত শেল স্ক্রিপ্ট ব্যবহার করেছি। এটি একটি প্যারামিটার হিসাবে ডাটাবেসের নাম নেয় এবং সমস্ত টেবিলকে অন্য চরসেট এবং কোলেশনে রূপান্তর করে (স্ক্রিপ্টে সংজ্ঞায়িত অন্য পরামিতি বা ডিফল্ট মান দ্বারা দেওয়া)।

#!/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
)

1

আমার সমাধানটি @ ডিজিন্টারস এবং @ কোসনোই উত্তরগুলির সংমিশ্রণ।

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>আপনার অনুরোধ করা এনকোডিংয়ে রূপান্তর করে। এটি প্রতিটি কলামের এনকোডিংও পরিবর্তন করে !


1

এসকিউএল অনুরোধের মাধ্যমে এসকিউএল স্ক্রিপ্ট উত্পন্ন করা ভালতর বৈকল্পিক। এটি ডিফল্ট / নালগুলি নষ্ট করবে না।

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

0

দ্রুত উপায় - এসকিউএল ফাইলে রফতানি করুন, অনুসন্ধানটি ব্যবহার করুন এবং আপনার যে পাঠ্যটি পরিবর্তন করতে হবে তা পরিবর্তন করতে প্রতিস্থাপন করুন। নতুন ডাটাবেস তৈরি করুন, ডেটা আমদানি করুন এবং তারপরে পুরাতন ডাটাবেস এবং নতুনটিকে নতুন নামকরণ করুন।


0

ডাটাবেসের সমস্ত টেবিলের সমস্ত ক্ষেত্রের একযোগে পরিবর্তন করতে:

আমি উল্লেখ করার আগে পিএইচপি এর মাধ্যমে সারণীতে টেবিলের মধ্যে ক্ষেত্রগুলির জন্য আরেকটি লুপ যুক্ত করছি। এটি সাহায্য করেছে, সারণীর সমস্ত ক্ষেত্রও রূপান্তরিত হয়েছে।

<?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!";

?>}

-1

আমি একটি প্রদত্ত ডাটাবেসে সমস্ত সারণী সন্ধান করতে এবং সেগুলি (এবং এর কলামগুলি) গোপন করতে সবেমাত্র একটি বাশ স্ক্রিপ্ট লিখেছি।

স্ক্রিপ্টটি এখানে উপলভ্য: https://github.com/Juddling/mysql-charset

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