MySQL tablosunun varsayılan karakter seti nasıl değiştirilir?


100

tableBu tanıma sahip bir MySQL var 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  

Ben değiştirmek istiyorum default charsetbu tablonun latin1için utf8. Bu nasıl yapılır ?


3
MySQL'deki "UTF8" için doğru isim "utf8mb4" dür. "Utf8" karakter kümesi bozuktur, yalnızca 3 bayt karaktere kadar destekler. Ayrıntılar için mysql kılavuzuna bakın veya google "mysql" ve "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

Yanıtlar:


210

Tabloyu default character setve tüm karakter sütunlarını yeni bir karakter setiyle değiştirmek istiyorsanız , aşağıdaki gibi bir ifade kullanın:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Yani sorgu şöyle olacaktır:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

23
Bunun aksine, ALTER TABLE tbl CHARACTER SET utf8sözdizimini başkalarının önerdiği şekilde kullanırsanız, tablo için yalnızca varsayılan kodlamayı değiştirirsiniz; Bu yanıtı kullanırsanız, mevcut sütunlar olacağı gibi dönüştürülmeyecektir.
eaj

8
Bu değişikliği bir veritabanında ut8'de kodlanmamış tüm tablolara uygulamak istiyorsanız, bu sorguyu kullanabilir ve sonuçlanan sorguları çalıştırabilirsiniz: 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
bu, varsayılan karakter kümesini değiştirmez . varsayılanı değiştirmek için söylediği gibi yapALTER TABLE tbl CHARACTER SET utf8
Muhasebeci,

7
Utf8'in olmasını beklediğiniz şeyi elde etmek için genellikle utf8 kullanmak istemediğinizi ama utf8mb4'ü kullanmak istemediğinizi eklemek isterim. Açıklamak gerekirse: MySQL'de utf8 gerçekten utf8'in sadece bir alt kümesidir ve utf8mb3 olarak daha iyi adlandırılır. Belirtilen 4 bayt yerine yalnızca 3 bayta kadar utf8 karakterini kodlayabilir. Bu, birçok emojinin kodlanamayacağı ve bunları DB'ye yazmaya çalışırsanız kaybolacağı anlamına gelir. Örneğin bkz. detaylar için medium.com/@adamhooper/… .
dwt

7
kullanabileceğiniz çok ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
bayt

19

Tablonun varsayılan karakter kümesini değiştirin:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Dize sütun karakter kümesini değiştirmek için bu sorguyu kullanın:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;

12
Asla ama asla utf8_general_ci kullanmamalısınız: bu işe yaramıyor. Bu, ASCII'nin elli yıl öncesinden kalma kötü eski günlerine bir geri dönüş. Unicode büyük / küçük harfe duyarlı olmayan eşleştirme, UCD'nin katlama haritası olmadan yapılamaz. Örneğin, “Σίσυφος” içinde üç farklı sigma vardır; veya "TSCHüẞ" nin küçük harfinin "tschüβ" olduğu, ancak "tschüβ" nin büyük harfinin "TSCHÜSS" olduğu. Haklı olabilirsin ya da hızlı olabilirsin. Bu nedenle utf8_unicode_ci kullanmalısınız, çünkü doğruluğu önemsemiyorsanız, onu sonsuz hızlı yapmak önemsizdir.
Yohanes AI

2
MySQL UTF8 karakter seti bozuk, utf8mb4 kullanmanız gerekiyor!
Samuel Åslund

5

ALTER TABLEMySQL komut hile yapmak gerekir. Aşağıdaki komut, tablonuzun varsayılan karakter kümesini ve tüm sütunlarının karakter kümesini UTF8 olarak değiştirecektir.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Bu komut, tablodaki tüm metin benzeri sütunları yeni karakter kümesine dönüştürür. Karakter kümeleri, karakter başına farklı miktarda veri kullanır, bu nedenle MySQL, eski sütun türüyle aynı sayıda karaktere sığacak kadar yer olduğundan emin olmak için bazı sütunların türünü dönüştürür.

Herhangi bir canlı veriyi değiştirmeden önce ALTER TABLE MySQL belgelerini okumanızı tavsiye ederim .


1
Evet, hile yapar, ancak bir şey yola dönüştürmeyle farklıdır : eski karakter kümesi seçeneğini sütunlardan otomatik olarak kaldıramaz.
tech_me

3

Birisi tüm veritabanı tabloları için varsayılan karakter kümesini değiştirmek ve verileri dönüştürmek için eksiksiz bir çözüm arıyorsa, bu şu olabilir:

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 ;

Bu kodu örneğin dosyanın içine yerleştirebilir chg_char_set.sqlve örneğin MySQL terminalinden çağırarak çalıştırabilirsiniz:

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

Ardından, istenen giriş parametreleri ile tanımlanmış prosedürü çağırın, örn

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

Sonuçları test ettikten sonra, saklanan bu prosedürleri bırakabilirsiniz:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;

Bizi de görünümleri seçmeye yönlendiren eksik bir durum var. WHERE table_schema = DATABASE (); => NEREDE table_schema = VERİTABANI () VE table_type = 'TABAN TABLOSU'; Ama teşekkürler!! İhtiyacım olan şey bu!
nguyenhoai890

2

Varsayılanı bir ile değiştirebilirsiniz, alter table set default charsetancak bu, mevcut sütunların karakter kümesini değiştirmez. Bunu değiştirmek için bir alter table modify column.

Bir sütunun karakter kümesini değiştirmek, yalnızca daha geniş bir karakter aralığını depolayabileceği anlamına gelir. Uygulamanız mysql istemcisini kullanarak db ile konuşur, bu nedenle istemci kodlamasını da değiştirmeniz gerekebilir.


İPod touch üzerindeki sınırlı klavye olmasaydı yapardım :-)
Joni

İyi iPod Touch / iPhone gerekir sahip bazı dezavantajı. :-P Siz bahsedene kadar kayıp olduklarını hiç fark etmediniz. ;-)
Aufwind

Geri alıntı karakterini görmek için tırnak karakterinin düğmesini basılı tutun.
Chloe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.