Come modificare il set di caratteri predefinito di una tabella MySQL?


97

C'è un MySQL tableche ha questa definizione presa da 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  

Voglio cambiare il default charsetdi questa tabella da latin1a utf8. Come farlo ?


3
Il nome corretto per "UTF8" in MySQL è "utf8mb4", il set di caratteri "utf8" è rotto, supporta solo caratteri fino a 3 byte. Vedi il manuale mysql per i dettagli, o google "mysql" e "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

Risposte:


203

Se desideri modificare la tabella default character sete tutte le colonne di caratteri in un nuovo set di caratteri, utilizza un'istruzione come questa:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Quindi la query sarà:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

22
Al contrario, se usi solo la ALTER TABLE tbl CHARACTER SET utf8sintassi suggerita da altri, cambierai solo la codifica predefinita per la tabella; le colonne esistenti non verranno convertite come faranno se utilizzi questa risposta.
eaj

7
Se desideri applicare questa modifica a tutte le tabelle che non sono codificate in ut8 in un database, puoi utilizzare questa query ed eseguire le query risultanti: 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
questo non cambia il set di caratteri predefinito . per modificare l'impostazione predefinita, fai come eak dettoALTER TABLE tbl CHARACTER SET utf8
Accountant م

7
Vorrei aggiungere che di solito non si desidera utilizzare utf8 ma utf8mb4 invece per ottenere ciò che ci si potrebbe aspettare che sia utf8. Per spiegare: in MySQL utf8 è in realtà solo un sottoinsieme di utf8, che sarebbe meglio chiamato utf8mb3. Può codificare solo fino a 3 byte di caratteri utf8 invece dei fino a 4 byte specificati. Ciò significa che molte emoji non saranno codificabili e andranno perse se provi a scriverle nel DB. Vedi ad es. medium.com/@adamhooper/… per i dettagli.
dwt

6
per multibyte puoi usareALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha

18

Modifica il set di caratteri predefinito della tabella:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Per modificare il set di caratteri della colonna della stringa, eseguire questa query:

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

10
Non dovresti mai e poi mai usare utf8_general_ci: semplicemente non funziona. È un ritorno ai brutti vecchi tempi della stooopedità ASCII di cinquant'anni fa. La corrispondenza Unicode senza distinzione tra maiuscole e minuscole non può essere eseguita senza la mappa foldcase dall'UCD. Ad esempio, "Σίσυφος" contiene tre diversi sigma; o come la minuscola di "TSCHüẞ" è "tschüβ", ma la maiuscola di "tschüβ" è "TSCHÜSS". Puoi avere ragione o essere veloce. Quindi devi usare utf8_unicode_ci, perché se non ti interessa la correttezza, allora è banale renderlo infinitamente veloce.
Yohanes AI

1
Il set di caratteri MySQL UTF8 non funziona, devi usare utf8mb4!
Samuel Åslund

5

Il ALTER TABLEcomando MySQL dovrebbe fare il trucco. Il comando seguente cambierà il set di caratteri predefinito della tabella e il set di caratteri di tutte le sue colonne in UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Questo comando convertirà tutte le colonne di testo nella tabella nel nuovo set di caratteri. I set di caratteri utilizzano diverse quantità di dati per carattere, quindi MySQL convertirà il tipo di alcune colonne per garantire che ci sia spazio sufficiente per contenere lo stesso numero di caratteri del vecchio tipo di colonna.

Ti consiglio di leggere la documentazione di ALTER TABLE MySQL prima di modificare qualsiasi dato live.


1
Sì, fa il trucco, ma una cosa è diversa con il convert to way: non può rimuovere automaticamente la vecchia opzione charset dalle colonne.
tech_me

3

Se qualcuno sta cercando una soluzione completa per modificare il set di caratteri predefinito per tutte le tabelle del database e convertire i dati, questa potrebbe essere una:

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 ;

Puoi inserire questo codice all'interno del file, ad esempio, chg_char_set.sqled eseguirlo, ad esempio chiamandolo dal terminale MySQL:

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

Quindi chiamare la procedura definita con i parametri di input desiderati, ad es

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

Dopo aver testato i risultati, puoi eliminare quelle stored procedure:

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

C'è una condizione mancante che ci porta a selezionare anche le visualizzazioni. È WHERE table_schema = DATABASE (); => WHERE table_schema = DATABASE () AND table_type = 'BASE TABLE'; Ma grazie!! Questo è ciò di cui ho bisogno!
nguyenhoai890

2

Puoi modificare l'impostazione predefinita con un, alter table set default charsetma ciò non cambierà il set di caratteri delle colonne esistenti. Per cambiare questo è necessario utilizzare un file alter table modify column.

Cambiare il set di caratteri di una colonna significa solo che sarà in grado di memorizzare una gamma più ampia di caratteri. La tua applicazione comunica con il database utilizzando il client mysql, quindi potresti dover modificare anche la codifica del client.


Lo farei se non fosse per la tastiera limitata dell'iPod touch :-)
Joni

ebbene l'iPod Touch / iPhone deve avere qualche inconveniente. :-P Non mi sono mai accorto che mancano fino a quando non ne hai parlato. ;-)
Aufwind

Tieni premuto il pulsante per il carattere di citazione per vedere il carattere di citazione.
Chloe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.