Wie ändere ich die Sortierung von Datenbank, Tabelle, Spalte?
Die ausgewählte Antwort gibt sie nur auf Tabellenebene an.
Datenbankweit ändern:
ALTERDATABASE<database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ändern pro Tabelle:
ALTERTABLE<table_name>CONVERTTO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Es wird empfohlen, es auf Tabellenebene zu ändern, da es auch für Spalten geändert wird. Das Ändern für eine bestimmte Spalte ist für einen bestimmten Fall.
Ändern der Sortierung für eine bestimmte Spalte:
ALTERTABLE<table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Dieser beantwortet die Frage tatsächlich direkt. Ich brauchte dies, da meine Änderungen auf Tabellenebene die Spalten NICHT aktualisierten. Ich werde das später untersuchen. Aber das sind die Informationen, die mich durch die schweren Zeiten gebracht haben. Vielen Dank.
Parapluie
9
Die beste Antwort darauf.
Jubi4dition
Ja, Sie müssen den Spaltentyp spezifizieren. Hier ist ein magischer Befehl, um alle Typen zu erhalten. Mit der mehrzeiligen Bearbeitung können Sie den Befehl generieren, alle Spalten auf einmal zu aktualisieren, beginnend hier:SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
William Entriken
Für eine einzelne Spalte können Sie einfach Folgendes tun: ALTER TABLE Tabellenname ÄNDERN Spaltenname VARCHAR (45) COLLATE utf8mb4_bin;
TomoMiha
68
Sie können ein PHP-Skript ausführen.
<?php
$con = mysql_connect('localhost','user','password');if(!$con){ echo "Cannot connect to the database ";die();}
mysql_select_db('dbname');$result=mysql_query('show tables');while($tables = mysql_fetch_array($result)){
foreach ($tables as$key=>$value){
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");}}
echo "The collation of your database has been successfully changed!";?>
Um die Sortierung für Tabellen einzeln zu ändern, können Sie Folgendes verwenden:
ALTERTABLE mytable CONVERTTO CHARACTER SET utf8
Um die Standardkollatierung für die gesamte Datenbank festzulegen,
ALTERDATABASE`databasename`DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
oder aber,
Gehen Sie zu PhpMyAdmin-> Operations-> Collation.
Dort finden Sie das Auswahlfeld, das alle vorhandenen Kollatierungen enthält. Damit Sie hier Ihre Sortierung ändern können. Hier folgt also nach der Datenbanktabelle diese Sortierung, während Sie eine neue Spalte erstellen. Beim Erstellen neuer Spalten muss keine Sortierung ausgewählt werden.
Die folgende Abfrage generiert ALTER-Abfragen, die die Sortierung für alle entsprechenden Spalten in allen Tabellen in einen bestimmten Typ ändern (utf8_general_ci in meinem Beispiel unten).
SELECT concat
('ALTER TABLE ',
t1.TABLE_SCHEMA,'.',
t1.table_name,' MODIFY ',
t1.column_name,' ',
t1.data_type,'(',
CHARACTER_MAXIMUM_LENGTH,')',' CHARACTER SET utf8 COLLATE utf8_general_ci;')from
information_schema.columns t1
where
t1.TABLE_SCHEMA like'you_db_name_goes_here'AND
t1.COLLATION_NAME ISNOTNULLAND
t1.COLLATION_NAME NOTIN('utf8_general_ci');
+1 Diese Antwort gefällt mir am besten. Nicht jeder hat PHP magisch irgendwo. Einige verwenden andere Sprachen mit MySQL. Dies war einfach in MySQL Workbench auszuführen, die Zeilen zu kopieren und einzufügen. Ich habe gerade den zusätzlichen Schritt gemacht, um das oben genannte für information_schema.tablesund den Code in concat auszuführenALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Pierre
1
Dies führt zu Fehlern bei (mittleren / langen)
Textspaltentypen
11
Wenn Sie phpMyAdmin ausführen >> Datenbank auswählen >> Tabelle auswählen >> Gehen Sie zur Registerkarte "Operationen" >> im Abschnitt "Tabellenoptionen" >>, können Sie Kollatierung aus der Dropdown-Liste auswählen >> und drücken Sie {Los} auf der Am oberen Bildschirmrand wird eine Meldung angezeigt:
Ihre SQL-Abfrage wurde erfolgreich ausgeführt
und ein Skript
ALTERTABLE`tableName`CONVERTTO CHARACTER SET utf8 COLLATE utf8_general_ci
Die Sortierungen vorhandener Spalten werden jedoch NICHT geändert. Dazu können Sie dieses Skript verwenden (dieses stammt ebenfalls von phpMyAdmin).
ALTERTABLE`tableName` CHANGE `Name``Name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOTNULL
Führen Sie einfach diese SQL aus, um alle Datenbanktabellen gleichzeitig zu konvertieren. Ändern Sie Ihre COLLATION und Ihren Datenbanknamen nach Ihren Wünschen.
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA,'.', TABLE_NAME," COLLATE utf8_general_ci;")AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="databaseName"AND TABLE_TYPE="BASE TABLE";
Sie können das CHARSET und die COLLATION aller Ihrer Tabellen über das PHP-Skript wie folgt ändern. Ich mag die Antwort von hkasera, aber das Problem dabei ist, dass die Abfrage zweimal auf jeder Tabelle ausgeführt wird. Dieser Code ist fast identisch, außer dass MySqli anstelle von MySQL verwendet wird und doppelte Abfragen verhindert werden. Wenn ich abstimmen könnte, hätte ich die Antwort von hkasera abgestimmt.
<?php
$conn1=new MySQLi("localhost","user","password","database");if($conn1->connect_errno){
echo mysqli_connect_error();exit;}$res=$conn1->query("show tables")or die($conn1->error);while($tables=$res->fetch_array()){$conn1->query("ALTER TABLE $tables[0] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")or die($conn1->error);}
echo "The collation of your database has been successfully changed!";$res->free();$conn1->close();?>
Dies hat bei mir nach dem Upgrade auf Zabbix 5 perfekt funktioniert. Um nur zu sagen, dass ich den Zeichensatz und die Sortierung wie folgt geändert habe : CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin.
robe007
4
Sie können diesen Code einfach zur Skriptdatei hinzufügen
//Database Connection
$host ='localhost';$db_name ='your_database_name';$db_user ='your_database_user_name';$db_pass ='your_database_user_password';$con = mysql_connect($host,$db_user,$db_pass);if(!$con){ echo "Cannot connect to the database ";die();}
mysql_select_db($db_name);$result=mysql_query('show tables');while($tables = mysql_fetch_array($result)){
foreach ($tables as$key=>$value){
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");}}
echo "The collation of your database has been successfully changed!";
Ich war überrascht zu erfahren, und so musste ich hierher zurückkehren und berichten, dass das ausgezeichnete und gut gepflegte Skript Interconnect / it SAFE SEARCH AND REPLACE ON DATABASE einige Optionen zum Konvertieren von Tabellen in utf8 / unicode und sogar zum Konvertieren in innodb bietet . Es ist ein Skript, das häufig zum Migrieren einer datenbankgesteuerten Website (Wordpress, Drupal, Joomla usw.) von einer Domäne in eine andere verwendet wird.
Ich habe hier gelesen, dass Sie jede Tabelle manuell konvertieren müssen, es ist nicht wahr. Hier ist eine Lösung, wie es mit einer gespeicherten Prozedur gemacht wird:
DELIMITER $$DROPPROCEDUREIFEXISTS changeCollation$$-- character_set parameter could be 'utf8'-- or 'latin1' or any other valid character setCREATEPROCEDURE changeCollation(IN character_set VARCHAR(255))BEGINDECLARE v_finished INTEGER DEFAULT0;DECLARE v_table_name varchar(255)DEFAULT"";DECLARE v_message varchar(4000)DEFAULT"No records";-- This will create a cursor that selects each table,-- where the character set is not the one-- that is defined in the parameterDECLARE alter_cursor CURSORFORSELECTDISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA =DATABASE()AND COLLATION_NAME NOTLIKE CONCAT(character_set,'_%');-- This handler will set the value v_finished to 1-- if there are no more rowsDECLARECONTINUE HANDLER
FORNOT FOUND SET v_finished =1;OPEN alter_cursor;-- Start a loop to fetch each rows from the cursor
get_table: LOOP
-- Fetch the table names one by oneFETCH alter_cursor INTO v_table_name;-- If there is no more record, then we have to skip-- the commands inside the loopIF v_finished =1THEN
LEAVE get_table;ENDIF;IF v_table_name !=''THENIF v_message ='No records'THENSET v_message ='';ENDIF;-- This technic makes the trick, it prepares a statement-- that is based on the v_table_name parameter and it means-- that this one is different by each iteration inside the loopSET@s = CONCAT('ALTER TABLE ',v_table_name,' CONVERT TO CHARACTER SET ', character_set);
PREPARE stmt FROM@s;EXECUTE stmt;DEALLOCATE PREPARE stmt;SET v_message = CONCAT('The table ', v_table_name ,' was changed to the default collation of ', character_set,'.\n', v_message);SET v_table_name ='';ENDIF;-- Close the loop and the cursorEND LOOP get_table;CLOSE alter_cursor;-- Returns information about the altered tables or 'No records'SELECT v_message;END$$
DELIMITER ;
Nachdem die Prozedur erstellt wurde, rufen Sie sie einfach auf:
Ich habe das folgende Shell-Skript verwendet. Es verwendet den Datenbanknamen als Parameter und konvertiert alle Tabellen in einen anderen Zeichensatz und eine andere Sortierung (angegeben durch andere Parameter oder einen im Skript definierten Standardwert).
#!/bin/bash
# mycollate.sh <database>[<charset><collation>]# changes MySQL/MariaDB charset and collation for one database-all tables and#all columns inall tables
DB="$1"
CHARSET="$2"
COLL="$3"[-n "$DB"]||exit1[-n "$CHARSET"]|| CHARSET="utf8mb4"[-n "$COLL"]|| COLL="utf8mb4_general_ci"
echo $DB
echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;"| mysql
echo "USE $DB; SHOW TABLES;"| mysql -s |(whilereadTABLE; do
echo $DB.$TABLE
echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;"| mysql $DB
done
)
Meine Lösung ist eine Kombination aus @Dzintars und @Quassnoi Answer.
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA,'.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 ;")AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="<your-database>"AND TABLE_TYPE="BASE TABLE";
Durch die Verwendung von CONVERT TOwird ein Skript generiert, das alle Tabellen von <your-database>in Ihre angeforderte Codierung konvertiert . Dies ändert auch die Codierung jeder Spalte !
Schneller Weg - Exportieren Sie in eine SQL-Datei, verwenden Sie Suchen und Ersetzen, um den zu ändernden Text zu ändern. Erstellen Sie eine neue Datenbank, importieren Sie die Daten und benennen Sie die alte und die neue Datenbank in den alten Namen um.
So ändern Sie die Sortierung aller Felder in allen Tabellen einer Datenbank gleichzeitig:
Ich habe der Lösung über PHP gerade eine weitere Schleife für die Felder in den Tabellen hinzugefügt, die zuvor erwähnt wurde. Dies hat geholfen, alle Felder in den Tabellen werden ebenfalls konvertiert.
<?php
$con = mysql_connect('localhost','user','pw');if(!$con){ echo "Cannot connect to the database ";die();}
mysql_select_db('database_name');$result=mysql_query('show tables');while($tables = mysql_fetch_array($result)){
foreach ($tables as$key=>$table){//for each table$sql ="ALTER TABLE $table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
echo "\n".$sql;
mysql_query($sql);$sql ="show fields in ".$table." where type like 'varchar%' or type like 'char%' or type='text' or type='mediumtext';";$rs2=mysql_query($sql);while($rw2 = mysql_fetch_array($rs2)){//for each field intable$sql ="ALTER TABLE `".$table."` CHANGE `".$rw2['Field']."` `".$rw2['Field']."` ".$rw2['Type']." CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;";
echo "\n".$sql;
mysql_query($sql);}}}
echo "The collation of your database has been successfully changed!";?>}
Antworten:
Sie müssen entweder jede Tabelle einzeln konvertieren:
(dies konvertiert die Spalten genauso gut) oder exportieren Sie die Datenbank mit
latin1
und importieren Sie sie zurück mitutf8mb4
.quelle
@rsensan
:CONVERT
ändert auch die Sortierung von Spalten.database
SCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;MYTABLE
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Bitte benutze utf8_general_ci nicht mehr ;-)Ich trage hier bei, als das OP fragte:
Die ausgewählte Antwort gibt sie nur auf Tabellenebene an.
Datenbankweit ändern:
Ändern pro Tabelle:
Es wird empfohlen, es auf Tabellenebene zu ändern, da es auch für Spalten geändert wird. Das Ändern für eine bestimmte Spalte ist für einen bestimmten Fall.
Ändern der Sortierung für eine bestimmte Spalte:
quelle
SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
Sie können ein PHP-Skript ausführen.
quelle
Um die Sortierung für Tabellen einzeln zu ändern, können Sie Folgendes verwenden:
Um die Standardkollatierung für die gesamte Datenbank festzulegen,
oder aber,
Gehen Sie zu PhpMyAdmin-> Operations-> Collation.
Dort finden Sie das Auswahlfeld, das alle vorhandenen Kollatierungen enthält. Damit Sie hier Ihre Sortierung ändern können. Hier folgt also nach der Datenbanktabelle diese Sortierung, während Sie eine neue Spalte erstellen. Beim Erstellen neuer Spalten muss keine Sortierung ausgewählt werden.
quelle
Die folgende Abfrage generiert ALTER-Abfragen, die die Sortierung für alle entsprechenden Spalten in allen Tabellen in einen bestimmten Typ ändern (utf8_general_ci in meinem Beispiel unten).
quelle
information_schema.tables
und den Code in concat auszuführenALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Wenn Sie phpMyAdmin ausführen >> Datenbank auswählen >> Tabelle auswählen >> Gehen Sie zur Registerkarte "Operationen" >> im Abschnitt "Tabellenoptionen" >>, können Sie Kollatierung aus der Dropdown-Liste auswählen >> und drücken Sie {Los} auf der Am oberen Bildschirmrand wird eine Meldung angezeigt:
und ein Skript
Die Sortierungen vorhandener Spalten werden jedoch NICHT geändert. Dazu können Sie dieses Skript verwenden (dieses stammt ebenfalls von phpMyAdmin).
quelle
Sie können die Standardkollatierung auf mehreren Ebenen festlegen:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1) Client 2) Server Standard 3) Datenbank Standard 4) Tabelle Standard 5) Spalte
quelle
Führen Sie einfach diese SQL aus, um alle Datenbanktabellen gleichzeitig zu konvertieren. Ändern Sie Ihre COLLATION und Ihren Datenbanknamen nach Ihren Wünschen.
quelle
Sie können das CHARSET und die COLLATION aller Ihrer Tabellen über das PHP-Skript wie folgt ändern. Ich mag die Antwort von hkasera, aber das Problem dabei ist, dass die Abfrage zweimal auf jeder Tabelle ausgeführt wird. Dieser Code ist fast identisch, außer dass MySqli anstelle von MySQL verwendet wird und doppelte Abfragen verhindert werden. Wenn ich abstimmen könnte, hätte ich die Antwort von hkasera abgestimmt.
quelle
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
.Sie können diesen Code einfach zur Skriptdatei hinzufügen
quelle
Ich war überrascht zu erfahren, und so musste ich hierher zurückkehren und berichten, dass das ausgezeichnete und gut gepflegte Skript Interconnect / it SAFE SEARCH AND REPLACE ON DATABASE einige Optionen zum Konvertieren von Tabellen in utf8 / unicode und sogar zum Konvertieren in innodb bietet . Es ist ein Skript, das häufig zum Migrieren einer datenbankgesteuerten Website (Wordpress, Drupal, Joomla usw.) von einer Domäne in eine andere verwendet wird.
quelle
Ich habe hier gelesen, dass Sie jede Tabelle manuell konvertieren müssen, es ist nicht wahr. Hier ist eine Lösung, wie es mit einer gespeicherten Prozedur gemacht wird:
Nachdem die Prozedur erstellt wurde, rufen Sie sie einfach auf:
Für weitere Details lesen Sie diesen Blog .
quelle
Wenn Sie den Standardzeichensatz für ein Schema aktualisieren möchten:
quelle
Ich habe das folgende Shell-Skript verwendet. Es verwendet den Datenbanknamen als Parameter und konvertiert alle Tabellen in einen anderen Zeichensatz und eine andere Sortierung (angegeben durch andere Parameter oder einen im Skript definierten Standardwert).
quelle
Meine Lösung ist eine Kombination aus @Dzintars und @Quassnoi Answer.
Durch die Verwendung von
CONVERT TO
wird ein Skript generiert, das alle Tabellen von<your-database>
in Ihre angeforderte Codierung konvertiert . Dies ändert auch die Codierung jeder Spalte !quelle
Bessere Variante zum Generieren eines SQL-Skripts per SQL-Anforderung. Standardwerte / Nullen werden nicht ruiniert.
quelle
Schneller Weg - Exportieren Sie in eine SQL-Datei, verwenden Sie Suchen und Ersetzen, um den zu ändernden Text zu ändern. Erstellen Sie eine neue Datenbank, importieren Sie die Daten und benennen Sie die alte und die neue Datenbank in den alten Namen um.
quelle
So ändern Sie die Sortierung aller Felder in allen Tabellen einer Datenbank gleichzeitig:
Ich habe der Lösung über PHP gerade eine weitere Schleife für die Felder in den Tabellen hinzugefügt, die zuvor erwähnt wurde. Dies hat geholfen, alle Felder in den Tabellen werden ebenfalls konvertiert.
quelle
Ich habe gerade ein Bash-Skript geschrieben, um alle Tabellen in einer bestimmten Datenbank zu finden und sie (und ihre Spalten) zu verbergen.
Das Skript finden Sie hier: https://github.com/Juddling/mysql-charset
quelle