Як змінити набір символів за замовчуванням для таблиці MySQL?


95

Існує 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
Самуель Ослунд,

Відповіді:


201

Якщо ви хочете змінити таблицю default character setта всі стовпці символів на новий набір символів, використовуйте такий вираз:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Отже, запит буде:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

22
На відміну від цього, якщо ви просто використовуєте ALTER TABLE tbl CHARACTER SET utf8синтаксис, як пропонують інші, ви зміните лише кодування за замовчуванням для таблиці; існуючі стовпці не будуть перетворені, як вони будуть, якщо ви використовуєте цю відповідь.
eaj

7
Якщо ви хочете застосувати цю зміну до всіх таблиць, які не закодовані в 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

6
для багатобайтного ви можете використовуватиALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha

18

Змінити набір символів за замовчуванням:

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;

10
Ніколи, ніколи не слід використовувати utf8_general_ci: це просто не працює. Це повернення до поганих старих часів суворої питомості ASCII від п'ятдесяти років тому. Зіставлення, не чутливе до регістру Unicode, неможливо здійснити без карти папок з UCD. Наприклад, “Σίσυφος” містить три різні сигми; або як мала літера “TSCHüẞ” означає “tschüβ”, але велика буква “tschüβ” - “TSCHÜSS”. Ти можеш бути правий, а можеш бути швидким. Тому ви повинні використовувати utf8_unicode_ci, тому що якщо ви не дбаєте про правильність, то тривіально зробити це нескінченно швидко.
Йоханес А.І.

1
Набір символів 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
Так, він робить трюк, але одне відрізняється від перетворення в спосіб: він не може автоматично видалити старий параметр кодування з стовпців.
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 () І тип_таблиці = 'BASE TABLE'; Але спасибі !! Це те, що мені потрібно!
nguyenhoai890

2

Ви можете змінити значення за замовчуванням за допомогою, alter table set default charsetале це не змінить набір символів існуючих стовпців. Щоб змінити це, потрібно використовувати a alter table modify column.

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


Я б, якби не обмежена клавіатура на iPod touch :-)
Джоні

ну iPod iPod / iPhone повинні мати деякі недоліки. :-P Ніколи не розумів, що вони зникли, поки ви про це не згадали. ;-)
Aufwind

Утримуйте кнопку для символу лапки, щоб побачити символ зворотного цитування.
Хлоя
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.