Как изменить кодировку таблицы MySQL по умолчанию?

100

Есть MySQL table, определение которой взято из 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  

Я хочу изменить default charsetэту таблицу с latin1на utf8. Как это сделать ?

феромикс
источник
3
Правильное имя для «UTF8» в MySQL - «utf8mb4», кодировка «utf8» не работает, она поддерживает только до 3-х байтовых символов. См. Подробности в руководстве по mysql или в Google "mysql" и "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Самуэль Ослунд

Ответы:

210

Если вы хотите изменить таблицу default character setи все символьные столбцы на новый набор символов, используйте такую ​​инструкцию:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Итак, запрос будет:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

источник
23
Напротив, если вы просто используете ALTER TABLE tbl CHARACTER SET utf8синтаксис, предложенный другими, вы измените только кодировку по умолчанию для таблицы; существующие столбцы не будут преобразованы, как если бы вы использовали этот ответ.
eaj
8
Если вы хотите применить это изменение ко всем таблицам, которые не закодированы в ut8 в базе данных, вы можете использовать этот запрос и выполнить полученные запросы: 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
это не меняет кодировку по умолчанию . чтобы изменить значение по умолчанию, сделайте так, как сказал eakALTER TABLE tbl CHARACTER SET utf8
Бухгалтер
7
Я хотел бы добавить, что обычно вы не хотите использовать utf8, а вместо этого использовать utf8mb4, чтобы получить то, что вы могли бы ожидать от utf8. Для объяснения: в MySQL utf8 - это просто подмножество utf8, которое лучше было бы назвать utf8mb3. Он может кодировать только до 3 байтов символов utf8 вместо указанных до 4 байтов. Это означает, что многие эмодзи не будут кодироваться и будут потеряны, если вы попытаетесь записать их в БД. См. Например. medium.com/@adamhooper/… для получения подробной информации.
DWT
7
для многобайтов можно использоватьALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha
19

Изменить кодировку таблицы по умолчанию:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Чтобы изменить кодировку строкового столбца, выполните этот запрос:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
Devart
источник
12
Вы никогда не должны использовать utf8_general_ci: это просто не работает. Это возврат к плохим старым временам суетности ASCII пятидесятилетней давности. Сопоставление без учета регистра Unicode не может быть выполнено без карты свертывания из UCD. Например, «Σίσυφος» имеет три разные сигмы; или как нижний регистр «TSCHüẞ» является «tschüβ», а верхний регистр «tschüβ» - «TSCHÜSS». Вы можете быть правы, а можете быть быстрыми. Поэтому вы должны использовать utf8_unicode_ci, потому что, если вы не заботитесь о правильности, то сделать это бесконечно быстро тривиально.
Йоханес AI 01
2
Кодировка MySQL UTF8 нарушена, вам нужно использовать utf8mb4!
Самуэль Ослунд
5

Команда ALTER TABLEMySQL должна помочь. Следующая команда изменит набор символов по умолчанию для вашей таблицы и набор символов всех ее столбцов на UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Эта команда преобразует все текстовые столбцы в таблице в новый набор символов. Наборы символов используют разное количество данных для каждого символа, поэтому MySQL преобразует тип некоторых столбцов, чтобы обеспечить достаточно места для того же количества символов, что и для старого типа столбца.

Я рекомендую вам прочитать документацию ALTER TABLE MySQL, прежде чем изменять какие-либо данные в реальном времени.

пирсадриан
источник
1
Да, это действительно так, но одно отличие от convert to way: оно не может автоматически удалить старую опцию набора символов из столбцов.
tech_me
3

Если кто-то ищет полное решение для изменения кодировки по умолчанию для всех таблиц базы данных и преобразования данных, это может быть одно:

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 ;

Вы можете поместить этот код в файл, например, chg_char_set.sqlи выполнить его, например, вызвав его из терминала MySQL:

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

Затем вызовите определенную процедуру с желаемыми входными параметрами, например

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

После проверки результатов вы можете отбросить эти хранимые процедуры:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;
Милиджан
источник
Отсутствует условие, которое заставляет нас также выбирать представления. Это ГДЕ table_schema = DATABASE (); => ГДЕ table_schema = DATABASE () AND table_type = 'БАЗОВАЯ ТАБЛИЦА'; Но спасибо!! Это то, что мне нужно!
nguyenhoai890
2

Вы можете изменить значение по умолчанию с помощью, alter table set default charsetно это не изменит кодировку существующих столбцов. Чтобы изменить это, вам нужно использовать файл alter table modify column.

Изменение кодировки столбца означает только то, что он сможет хранить более широкий диапазон символов. Ваше приложение общается с db с помощью клиента mysql, поэтому вам может потребоваться также изменить кодировку клиента.

Джони
источник
Я бы стал, если бы не ограниченная клавиатура на iPod touch :-)
Джони
ну, у iPod Touch / iPhone должен быть какой-то недостаток. :-P Никогда не осознавал, что их не хватает, пока вы об этом не упомянули. ;-)
Aufwind
Удерживайте кнопку символа кавычки, чтобы увидеть символ обратной кавычки.
Хлоя