Как изменить кодировку по умолчанию таблицы MySQL?
Существует 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
. Как это сделать?
Ответы
Ответ 1
Если вы хотите изменить таблицу default character set
и все столбцы символов на новый набор символов, используйте оператор, подобный этому:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Таким образом, запрос будет выглядеть следующим образом:
ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;
Ответ 2
Изменить кодировку по умолчанию для таблицы:
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;
Ответ 3
Команда ALTER TABLE
MySQL должна сделать свое дело. Следующая команда изменит набор символов по умолчанию вашей таблицы и набор символов всех ее столбцов на UTF8.
ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Эта команда преобразует все текстоподобные столбцы в таблице в новый набор символов. Наборы символов используют разные объемы данных на символ, поэтому MySQL преобразует тип некоторых столбцов, чтобы обеспечить достаточно места для того же количества символов, что и для старого типа столбца.
Я рекомендую вам прочитать документацию ALTER TABLE MySQL перед тем, как вносить изменения в оперативные данные.
Ответ 4
Если кто-то ищет полное решение для изменения кодировки по умолчанию для всех таблиц базы данных и преобразования данных, это может быть одно:
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';
Ответ 5
Вы можете изменить значение по умолчанию с помощью alter table set default charset
, но это не изменит кодировку существующих столбцов. Чтобы изменить это, вам нужно использовать alter table modify column
.
Изменение кодировки столбца означает, что он сможет хранить более широкий диапазон символов. Ваше приложение обращается к db с помощью клиента mysql, поэтому вам может потребоваться изменить клиентскую кодировку.