Jak zmienić domyślny zestaw znaków w tabeli MySQL?

100

Istnieje MySQL, tablektórego definicja pochodzi z 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  

Chcę zmienić default charsettę tabelę z latin1na utf8. Jak to zrobić ?

feromiks
źródło
3
Prawidłowa nazwa dla „UTF8” w MySQL to „utf8mb4”, zestaw znaków „utf8” jest uszkodzony, obsługuje tylko do 3 znaków bajtowych. Szczegółowe informacje można znaleźć w podręczniku mysql lub w google „mysql” i „utf8” ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund,

Odpowiedzi:

210

Jeśli chcesz zmienić tabelę default character seti wszystkie kolumny znaków na nowy zestaw znaków, użyj poniższej instrukcji:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Więc zapytanie będzie wyglądać następująco:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

źródło
23
Z drugiej strony, jeśli po prostu użyjesz ALTER TABLE tbl CHARACTER SET utf8składni zgodnie z sugestiami innych, zmienisz tylko domyślne kodowanie tabeli; istniejące kolumny nie zostaną przekonwertowane, tak jak będzie, jeśli użyjesz tej odpowiedzi.
eaj
8
Jeśli chcesz zastosować tę zmianę do wszystkich tabel, które nie są zakodowane w ut8 w bazie danych, możesz użyć tego zapytania i wykonać zapytania 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;
wynikowe
3
nie zmienia to domyślnego zestawu znaków. aby zmienić domyślne, zrób tak, jak powiedział eakALTER TABLE tbl CHARACTER SET utf8
Księgowy م
7
Chciałbym dodać, że zwykle nie chcesz używać utf8, ale zamiast tego utf8mb4, aby uzyskać to, czego możesz oczekiwać, że będzie utf8. Wyjaśnienie: w MySQL utf8 jest tak naprawdę tylko podzbiorem utf8, który lepiej byłoby nazwać utf8mb3. Może zakodować tylko do 3 bajtów znaków utf8 zamiast określonych do 4 bajtów. Oznacza to, że wielu emoji nie będzie można zakodować i zostaną utracone, jeśli spróbujesz zapisać je w bazie danych. Zobacz np. medium.com/@adamhooper/ ... aby uzyskać szczegółowe informacje.
dwt
7
dla wielobajtów, których możesz użyćALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha
19

Zmień domyślny zestaw znaków tabeli:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Aby zmienić zestaw znaków w kolumnie łańcuchowej, wykonaj następujące zapytanie:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
Devart
źródło
12
Nigdy, przenigdy nie powinieneś używać utf8_general_ci: to po prostu nie działa. To powrót do starych, złych czasów ASCII stooopeeedity sprzed pięćdziesięciu lat. Dopasowania bez rozróżniania wielkości liter w formacie Unicode nie można wykonać bez mapy składanej z UCD. Na przykład „Σίσυφος” ma w sobie trzy różne sigmaty; lub jak mała litera „TSCHüẞ” to „tschüβ”, ale duża litera „tschüβ” to „TSCHÜSS”. Możesz mieć rację lub możesz być szybki. Dlatego musisz użyć utf8_unicode_ci, ponieważ jeśli nie dbasz o poprawność, to trywialne jest uczynienie go nieskończenie szybkim.
Yohanes AI
2
Zestaw znaków MySQL UTF8 jest uszkodzony, musisz użyć utf8mb4!
Samuel Åslund
5

Polecenie ALTER TABLEMySQL powinno załatwić sprawę. Następujące polecenie zmieni domyślny zestaw znaków tabeli i zestaw znaków wszystkich jej kolumn na UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

To polecenie skonwertuje wszystkie kolumny tekstowe w tabeli na nowy zestaw znaków. Zestawy znaków używają różnych ilości danych na znak, więc MySQL przekonwertuje typ niektórych kolumn, aby zapewnić wystarczającą ilość miejsca, aby zmieścić taką samą liczbę znaków jak stary typ kolumny.

Zalecam przeczytanie dokumentacji ALTER TABLE MySQL przed modyfikacją jakichkolwiek danych na żywo.

piersadrian
źródło
1
Tak, działa, ale jedna rzecz jest inna w przypadku konwersji na sposób: nie może automatycznie usunąć starej opcji zestawu znaków z kolumn.
tech_me
3

Jeśli ktoś szuka kompletnego rozwiązania do zmiany domyślnego zestawu znaków dla wszystkich tabel bazy danych i konwersji danych, może to być jedno:

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 ;

Możesz umieścić ten kod w pliku np. chg_char_set.sqlI wykonać go np. Wywołując go z terminala MySQL:

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

Następnie wywołaj zdefiniowaną procedurę z żądanymi parametrami wejściowymi, np

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

Po przetestowaniu wyników możesz usunąć te procedury składowane:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;
milijan
źródło
Brakuje warunku, który prowadzi nas również do wybierania widoków. To jest GDZIE table_schema = DATABASE (); => GDZIE table_schema = DATABASE () AND table_type = 'BAZOWA TABELA'; Ale dzięki!! To jest to, czego potrzebuję!
nguyenhoai890
2

Możesz zmienić wartość domyślną za pomocą znaku, alter table set default charsetale to nie zmieni zestawu znaków w istniejących kolumnach. Aby to zmienić, musisz użyć pliku alter table modify column.

Zmiana zestawu znaków kolumny oznacza tylko, że będzie ona mogła przechowywać szerszy zakres znaków. Twoja aplikacja komunikuje się z bazą danych za pomocą klienta mysql, więc może zajść potrzeba zmiany kodowania klienta.

Joni
źródło
Zrobiłbym to, gdyby nie ograniczona klawiatura w iPodzie touch :-)
Joni
no cóż, iPod Touch / iPhone musi mieć jakąś wadę. :-P Nigdy nie zdawałem sobie sprawy, że ich brakuje, dopóki o tym nie wspomniałeś. ;-)
Aufwind
Przytrzymaj przycisk cudzysłowu, aby zobaczyć znak cudzysłowu.
Chloe