Wie ändere ich den Standardzeichensatz einer MySQL-Tabelle?

94

Es gibt ein MySQL table, dessen Definition übernommen wurde aus 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  

Ich möchte die default charsetdieser Tabelle von latin1auf ändern utf8. Wie geht das ?

Pheromix
quelle
3
Der korrekte Name für "UTF8" in MySQL lautet "utf8mb4". Der Zeichensatz "utf8" ist fehlerhaft und unterstützt nur bis zu 3-Byte-Zeichen. Weitere Informationen finden Sie im MySQL-Handbuch oder in Google "MySQL" und "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

Antworten:

200

Wenn Sie die Tabelle default character setund alle Zeichenspalten in einen neuen Zeichensatz ändern möchten , verwenden Sie eine Anweisung wie folgt:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Die Abfrage lautet also:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

quelle
22
Wenn Sie dagegen nur die ALTER TABLE tbl CHARACTER SET utf8von anderen vorgeschlagene Syntax verwenden, ändern Sie nur die Standardcodierung für die Tabelle. Bestehende Spalten werden nicht wie bei dieser Antwort konvertiert.
27.
7
Wenn Sie diese Änderung auf alle Tabellen anwenden möchten, die nicht in ut8 in einer Datenbank codiert sind, können Sie diese Abfrage verwenden und die resultierenden Abfragen ausführen: 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
Dadurch wird der Standardzeichensatz nicht geändert. Um die Standardeinstellung zu ändern, tun Sie wie gesagtALTER TABLE tbl CHARACTER SET utf8
Buchhalter
7
Ich möchte hinzufügen, dass Sie normalerweise nicht utf8, sondern utf8mb4 verwenden möchten, um das zu erhalten, was Sie von utf8 erwarten. Um es zu erklären: In MySQL ist utf8 wirklich nur eine Teilmenge von utf8, die besser utf8mb3 heißen würde. Es können nur bis zu 3 Bytes utf8-Zeichen anstelle der angegebenen bis zu 4 Bytes codiert werden. Dies bedeutet, dass viele Emoji nicht codierbar sind und nur verloren gehen, wenn Sie versuchen, sie in die Datenbank zu schreiben. Siehe z. medium.com/@adamhooper/… für Details.
Dwt
6
für Multibyte können Sie verwendenALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha
18

Ändern Sie den Standardzeichensatz der Tabelle:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

So ändern Sie den Zeichensatz für Zeichenfolgenspalten: Führen Sie diese Abfrage aus:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
Devart
quelle
10
Sie sollten niemals utf8_general_ci verwenden: Es funktioniert einfach nicht. Es ist ein Rückfall in die schlechten alten Zeiten der ASCII-Stooopeeedität vor fünfzig Jahren. Unicode-Matching ohne Berücksichtigung der Groß- und Kleinschreibung kann nicht ohne die Foldcase-Map von der UCD durchgeführt werden. Zum Beispiel hat "Σίσυφος" drei verschiedene Sigmen; oder wie der Kleinbuchstabe von „TSCHüẞ“ „tschüβ“ ist, der Großbuchstabe von „tschüβ“ jedoch „TSCHÜSS“. Sie können Recht haben oder Sie können schnell sein. Daher müssen Sie utf8_unicode_ci verwenden, denn wenn Ihnen die Korrektheit egal ist, ist es trivial, sie unendlich schnell zu machen.
Yohanes AI
1
Der MySQL UTF8-Zeichensatz ist defekt. Sie müssen utf8mb4 verwenden!
Samuel Åslund
5

Der ALTER TABLEMySQL-Befehl sollte den Trick machen. Der folgende Befehl ändert den Standardzeichensatz Ihrer Tabelle und den Zeichensatz aller Spalten in UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Dieser Befehl konvertiert alle textähnlichen Spalten in der Tabelle in den neuen Zeichensatz. Zeichensätze verwenden unterschiedliche Datenmengen pro Zeichen, sodass MySQL den Typ einiger Spalten konvertiert, um sicherzustellen, dass genügend Platz für die gleiche Anzahl von Zeichen wie der alte Spaltentyp vorhanden ist.

Ich empfehle Ihnen, die ALTER TABLE MySQL-Dokumentation zu lesen, bevor Sie Live-Daten ändern .

Piersadrian
quelle
1
Ja, es macht den Trick, aber eines ist bei der Konvertierung anders : Es kann die alte Zeichensatzoption nicht automatisch aus Spalten entfernen.
Tech_me
3

Wenn jemand nach einer vollständigen Lösung sucht, um den Standardzeichensatz für alle Datenbanktabellen zu ändern und die Daten zu konvertieren, kann dies eine sein:

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 ;

Sie können diesen Code in die Datei einfügen, z. B. chg_char_set.sqlausführen, indem Sie ihn vom MySQL-Terminal aus aufrufen:

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

Rufen Sie dann die definierte Prozedur mit den gewünschten Eingabeparametern auf, z

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

Sobald Sie die Ergebnisse getestet haben, können Sie die gespeicherten Prozeduren löschen:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;
Milijan
quelle
Es fehlt eine Bedingung, die dazu führt, dass wir auch Ansichten auswählen. Es ist WHERE table_schema = DATABASE (); => WHERE table_schema = DATABASE () AND table_type = 'BASE TABLE'; Aber danke!! Das ist das, was ich benötige!
Nguyenhoai890
2

Sie können die Standardeinstellung mit ändern, dies ändert alter table set default charsetjedoch nicht den Zeichensatz der vorhandenen Spalten. Um dies zu ändern, müssen Sie a verwenden alter table modify column.

Das Ändern des Zeichensatzes einer Spalte bedeutet nur, dass eine größere Anzahl von Zeichen gespeichert werden kann. Ihre Anwendung kommuniziert mit der Datenbank über den MySQL-Client, sodass Sie möglicherweise auch die Client-Codierung ändern müssen.

Joni
quelle
Ich würde, wenn es nicht die eingeschränkte Tastatur auf dem iPod touch gäbe :-)
Joni
auch der iPod Touch / iPhone muss hat einige Nachteile. :-P Ich habe nie bemerkt, dass sie fehlen, bis du es erwähnt hast. ;-)
Aufwind
Halten Sie die Taste für das Anführungszeichen gedrückt, um das Backquote-Zeichen anzuzeigen.
Chloe