Bagaimana cara mengubah charset default dari tabel MySQL?

100

Ada MySQL tableyang definisi ini diambil dari 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  

Saya ingin mengubah default charsettabel ini dari latin1menjadi utf8. Bagaimana cara melakukannya ?

feromix
sumber
3
Nama yang benar untuk "UTF8" di MySQL adalah "utf8mb4" charset "utf8" rusak, itu hanya mendukung hingga 3 karakter byte. Lihat manual mysql untuk detailnya, atau google "mysql" dan "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

Jawaban:

210

Jika Anda ingin mengubah tabel default character setdan semua kolom karakter menjadi kumpulan karakter baru, gunakan pernyataan seperti ini:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Jadi kueri akan menjadi:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

sumber
23
Sebaliknya, jika Anda hanya menggunakan ALTER TABLE tbl CHARACTER SET utf8sintaks seperti yang disarankan oleh orang lain, Anda hanya akan mengubah pengkodean default untuk tabel; kolom yang ada tidak akan dikonversi seperti jika Anda menggunakan jawaban ini.
eaj
8
Jika Anda ingin menerapkan perubahan ini untuk semua tabel yang tidak dikodekan di ut8 dalam database, Anda dapat menggunakan kueri ini dan menjalankan kueri yang dihasilkan: 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;
Maxooo
3
ini tidak mengubah charset default . untuk mengubah default lakukan seperti yang dikatakanALTER TABLE tbl CHARACTER SET utf8
Akuntan م
7
Saya ingin menambahkan bahwa biasanya Anda tidak ingin menggunakan utf8 tetapi utf8mb4 sebagai gantinya untuk mendapatkan apa yang Anda harapkan dari utf8. Untuk menjelaskan: di MySQL utf8 sebenarnya hanyalah bagian dari utf8, yang akan lebih baik dinamai utf8mb3. Ini hanya dapat menyandikan hingga 3 byte karakter utf8 alih-alih hingga 4 byte yang ditentukan. Ini berarti banyak emoji yang tidak dapat dikodekan dan hanya akan hilang jika Anda mencoba menulisnya ke DB. Lihat mis. medium.com/@adamhooper/… untuk detailnya.
dwt
7
untuk multibyte Anda dapat menggunakanALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha
19

Ubah kumpulan karakter default tabel:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Untuk mengubah charset kolom string, lakukan kueri ini:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
Devart
sumber
12
Anda tidak boleh, pernah menggunakan utf8_general_ci: itu tidak akan berhasil. Ini adalah kemunduran ke masa lalu yang buruk dari stooopeeedity ASCII dari lima puluh tahun yang lalu. Pencocokan unicode case-insensitive tidak dapat dilakukan tanpa peta flipcase dari UCD. Misalnya, “Σίσυφος” memiliki tiga sigma berbeda di dalamnya; atau bagaimana huruf kecil "TSCHüẞ" adalah "tschüβ", tetapi huruf besar dari "tschüβ" adalah "TSCHÜSS". Anda bisa benar, atau Anda bisa cepat. Oleh karena itu Anda harus menggunakan utf8_unicode_ci, karena jika Anda tidak peduli dengan kebenaran, maka mudah untuk membuatnya menjadi cepat tanpa batas.
Yohanes AI
2
Charset MySQL UTF8 rusak, Anda harus menggunakan utf8mb4!
Samuel Åslund
5

The ALTER TABLEperintah MySQL harus melakukan trik. Perintah berikut akan mengubah kumpulan karakter default dari tabel Anda dan kumpulan karakter dari semua kolomnya menjadi UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Perintah ini akan mengubah semua kolom seperti teks di tabel menjadi kumpulan karakter baru. Kumpulan karakter menggunakan jumlah data yang berbeda per karakter, jadi MySQL akan mengonversi jenis beberapa kolom untuk memastikan ada cukup ruang untuk memuat jumlah karakter yang sama dengan jenis kolom lama.

Saya sarankan Anda membaca dokumentasi ALTER TABLE MySQL sebelum mengubah data langsung apa pun.

piersadrian.dll
sumber
1
Ya, itu memang melakukan trik, tetapi satu hal yang berbeda dengan convert to way: ia tidak dapat menghapus opsi charset lama dari kolom secara otomatis.
tech_me
3

Jika seseorang mencari solusi lengkap untuk mengubah charset default untuk semua tabel database dan mengonversi data, ini bisa jadi salah satunya:

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 ;

Anda dapat menempatkan kode ini di dalam file misalnya chg_char_set.sql dan menjalankannya misalnya dengan memanggilnya dari terminal MySQL:

SOURCE ~/path-to-the-file/chg_char_set.sql

Kemudian panggil prosedur yang ditentukan dengan parameter input yang diinginkan misalnya

CALL change_character_set('utf8mb4', 'utf8mb4_bin');

Setelah Anda menguji hasilnya, Anda dapat membatalkan prosedur yang disimpan tersebut:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;
milijan
sumber
Ada kondisi yang hilang yang membuat kami memilih tampilan juga. Di MANA table_schema = DATABASE (); => DI MANA table_schema = DATABASE () DAN table_type = 'BASE TABLE'; Tapi terima kasih !! Inilah yang saya butuhkan!
nguyenhoai890
2

Anda dapat mengubah default dengan alter table set default charsettetapi itu tidak akan mengubah kumpulan karakter dari kolom yang ada. Untuk mengubahnya, Anda perlu menggunakan filealter table modify column .

Mengubah kumpulan karakter kolom hanya berarti dapat menyimpan karakter yang lebih luas. Aplikasi Anda berbicara ke db menggunakan klien mysql sehingga Anda mungkin perlu mengubah pengkodean klien juga.

Joni
sumber
Saya akan melakukannya jika bukan karena keyboard terbatas pada iPod touch :-)
Joni
baik iPod Touch / iPhone pasti memiliki beberapa kekurangan. :-P Tidak pernah menyadari bahwa mereka hilang sampai Anda menyebutkannya. ;-)
Aufwind
Tahan tombol karakter kutipan untuk melihat karakter kutipan latar belakang.
Chloe