Bagaimana cara mengubah susunan basis data, tabel, kolom?

200

Database latin1_general_cisekarang dan saya ingin mengubah pemeriksaan untuk utf8mb4_general_ci.

Apakah ada pengaturan di PhpMyAdmin untuk mengubah susunan basis data, tabel, kolom? Alih-alih mengubah satu per satu?

pengguna158469
sumber
3
Lihat ini untuk jawabannya: stackoverflow.com/questions/5906585/…
Timo Huovinen

Jawaban:

257

Anda perlu mengonversi setiap tabel secara individual:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 

(ini akan mengonversi kolom juga), atau ekspor database dengan latin1dan impor kembali dengan utf8mb4.

Quassnoi
sumber
15
Tetapi saya ingin mengubah susunan kolom. Ini hanya akan mengubah susunan tabel ..
user158469
7
@rsensan: CONVERTakan mengubah susunan kolom juga.
Quassnoi
21
ALTER SCHEMA database DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
stormwild
8
@stormwild: ini tidak akan memengaruhi tabel yang ada
Quassnoi
47
Permintaan saya: ALTER TABLE MYTABLECONVERT KE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Tolong jangan gunakan utf8_general_ci lagi ;-)
Kapitein Witbaard
209

Saya berkontribusi di sini, seperti yang diminta OP:

Bagaimana cara mengubah susunan basis data, tabel, kolom?

Jawaban yang dipilih hanya menyatakannya di tingkat tabel.


Mengubah luas basis data:

ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Mengubahnya per tabel:

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

Praktik yang baik adalah mengubahnya di level tabel karena itu akan mengubahnya untuk kolom juga. Mengubah kolom tertentu adalah untuk setiap kasus spesifik.

Mengubah susunan untuk kolom tertentu:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Nabeel Ahmed
sumber
15
Yang ini sebenarnya menjawab pertanyaan secara langsung. Saya membutuhkan ini, karena perubahan tingkat tabel saya TIDAK memperbarui kolom. Saya akan menyelidiki itu nanti; tetapi ini adalah informasi yang membuat saya melewati masa-masa sulit. Terima kasih.
Parapluie
9
Jawaban terbaik untuk ini.
jubi4dition
Ya, Anda perlu menentukan jenis kolom. Ini adalah perintah ajaib untuk mendapatkan semua tipe. Menggunakan pengeditan multi-baris Anda dapat membuat perintah untuk memperbarui semua kolom sekaligus mulai di sini: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');
William Entriken
Untuk satu kolom, Anda cukup melakukan: ALTER TABLE table_name CHANGE column_name VARCHAR (45) COLLATE utf8mb4_bin;
TomoMiha
68

Anda dapat menjalankan skrip 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!";
                ?>
hkasera
sumber
43

Untuk mengubah susunan untuk tabel secara individual yang dapat Anda gunakan,

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8

Untuk mengatur susunan default untuk seluruh database,

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

atau,

Goto PhpMyAdmin-> Operations-> Collation.

Di sana Anda menemukan kotak pilih yang berisi semua koleksi yang ada. Sehingga di sini Anda dapat mengubah susunan Anda. Jadi di sini setelah tabel database akan mengikuti pemeriksaan ini saat Anda membuat kolom baru. Tidak perlu memilih collation saat membuat kolom baru.

Astaga
sumber
Terima kasih banyak, ini sangat membantu
JoZ3
15

Kueri berikut akan menghasilkan kueri ALTER yang mengubah susunan untuk semua kolom yang sesuai di semua tabel ke tipe tertentu (utf8_general_ci dalam contoh saya di bawah).

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');
Parampal Pooni
sumber
+1 Saya paling suka jawaban ini. Tidak semua orang memiliki PHP di suatu tempat secara ajaib. Beberapa penggunaan menggunakan bahasa lain dengan MySQL. Ini mudah dijalankan di MySQL Workbench, salin baris dan tempel. Saya baru saja melakukan langkah ekstra untuk menjalankan information_schema.tableskode di atas dan dalam concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Pierre
1
Ini bug pada jenis kolom teks (sedang / panjang), yang harus dibersihkan secara manual
stiebrs
11

Jika Anda menjalankan phpMyAdmin >> pilih database >> pilih tabel >> buka tab "Operations" >> di bagian "Table options" >> Anda dapat memilih Collation dari daftar drop-down >> dan setelah Anda menekan {Go} di bagian di atas layar Anda akan melihat pesan:

Permintaan SQL Anda telah berhasil dijalankan

dan sebuah skrip

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

Tapi itu TIDAK akan mengubah susunan kolom yang ada. Untuk melakukannya, Anda dapat menggunakan skrip ini (skrip ini juga berasal dari phpMyAdmin)

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

Jalankan saja SQL ini untuk mengonversi semua tabel database sekaligus. Ubah COLLATION dan DatabaseName Anda dengan yang Anda butuhkan.

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";
Dzintars
sumber
4

Anda dapat mengubah CHARSET dan COLLATION dari semua tabel Anda melalui skrip PHP sebagai berikut. Saya suka jawaban hkasera tetapi masalahnya adalah bahwa kueri berjalan dua kali pada setiap tabel. Kode ini hampir sama kecuali menggunakan MySqli bukan mysql dan pencegahan permintaan ganda. Jika saya bisa memilih, saya akan memilih jawaban hkasera.

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

?>
mtmehdi
sumber
Ini bekerja untuk saya dengan sempurna, setelah upgrade ke Zabbix 5. Hanya untuk mengatakan bahwa saya mengubah Charset dan Kolasi seperti ini: CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin.
robe007
4

Anda dapat menambahkan kode ini ke file skrip

//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!";
Chandra Kumar
sumber
4

Saya terkejut mengetahui, dan jadi saya harus kembali ke sini dan melaporkan, bahwa Interkoneksi yang sangat baik dan terawat / itu AMAN PENCARIAN DAN PENGGANTIAN PADA skrip DATABASE memiliki beberapa opsi untuk mengonversi tabel ke utf8 / unicode, dan bahkan untuk mengkonversi ke innodb . Ini adalah skrip yang biasa digunakan untuk memigrasi situs web berbasis database (Wordpress, Drupal, Joomla, dll) dari satu domain ke domain lain.

tombol skrip interkoneksi

Adam Nofsinger
sumber
3

Saya membacanya di sini, bahwa Anda perlu mengkonversi setiap tabel secara manual, itu tidak benar. Berikut ini adalah solusi bagaimana melakukannya dengan prosedur tersimpan:

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 ;

Setelah prosedur dibuat, panggil saja:

CALL changeCollation('utf8');

Untuk lebih jelasnya baca blog ini .

András Ottó
sumber
2

jika Anda ingin memperbarui charset default pada skema:

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
Mircea Stanciu
sumber
1

Saya menggunakan skrip shell berikut. Dibutuhkan nama database sebagai parameter dan mengonversi semua tabel ke charset dan collation lain (diberikan oleh parameter lain atau nilai default yang ditentukan dalam skrip).

#!/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
)
Petr Stastny
sumber
1

Solusi saya adalah kombinasi dari @Dzintars dan @Quassnoi Answer.

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

Dengan menggunakan CONVERT TO, ini menghasilkan skrip, yang mengubah semua Tabel dari <your-database>ke pengkodean yang Anda minta. Ini juga mengubah penyandian setiap kolom !

Florian Kirmaier
sumber
1

Varian yang lebih baik untuk menghasilkan skrip SQL dengan permintaan SQL. Itu tidak akan merusak default / nulls.

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');
Max Ivanov
sumber
0

Cara cepat - ekspor ke file SQL, gunakan pencarian dan ganti untuk mengubah teks yang perlu Anda ubah. Buat database baru, impor data dan kemudian ganti nama database lama dan yang baru dengan nama lama.

kickoff3pm
sumber
0

Untuk mengubah susunan semua bidang dalam semua tabel database sekaligus:

Saya baru saja menambahkan loop lain untuk bidang dalam tabel ke solusi melalui Php sebelum disebutkan. Ini membantu, semua bidang dalam tabel juga dikonversi.

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

?>}
Kim Michael
sumber