Die Datenbank ist latin1_general_ci
jetzt und ich möchte die Sortierung in ändern utf8mb4_general_ci
.
Gibt es in PhpMyAdmin eine Einstellung zum Ändern der Sortierung von Datenbank, Tabelle und Spalte? Anstatt eins nach dem anderen zu ändern?
Die Datenbank ist latin1_general_ci
jetzt und ich möchte die Sortierung in ändern utf8mb4_general_ci
.
Gibt es in PhpMyAdmin eine Einstellung zum Ändern der Sortierung von Datenbank, Tabelle und Spalte? Anstatt eins nach dem anderen zu ändern?
Antworten:
Sie müssen entweder jede Tabelle einzeln konvertieren:
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4
(dies konvertiert die Spalten genauso gut) oder exportieren Sie die Datenbank mit latin1
und importieren Sie sie zurück mit utf8mb4
.
@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:
Wie ändere ich die Sortierung von Datenbank, Tabelle, Spalte?
Die ausgewählte Antwort gibt sie nur auf Tabellenebene an.
Datenbankweit ändern:
ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ändern pro Tabelle:
ALTER TABLE <table_name> CONVERT TO 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:
ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
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.
<?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:
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8
Um die Standardkollatierung für die gesamte Datenbank festzulegen,
ALTER DATABASE `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 IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');
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:
Ihre SQL-Abfrage wurde erfolgreich ausgeführt
und ein Skript
ALTER TABLE `tableName` CONVERT TO 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).
ALTER TABLE `tableName` CHANGE `Name` `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
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
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();
?>
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
.
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 $$
DROP PROCEDURE IF EXISTS changeCollation$$
-- character_set parameter could be 'utf8'
-- or 'latin1' or any other valid character set
CREATE PROCEDURE changeCollation(IN character_set VARCHAR(255))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
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 parameter
DECLARE alter_cursor CURSOR FOR SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND COLLATION_NAME NOT LIKE CONCAT(character_set, '_%');
-- This handler will set the value v_finished to 1
-- if there are no more rows
DECLARE CONTINUE HANDLER
FOR NOT 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 one
FETCH alter_cursor INTO v_table_name;
-- If there is no more record, then we have to skip
-- the commands inside the loop
IF v_finished = 1 THEN
LEAVE get_table;
END IF;
IF v_table_name != '' THEN
IF v_message = 'No records' THEN
SET v_message = '';
END IF;
-- 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 loop
SET @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 = '';
END IF;
-- Close the loop and the cursor
END 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:
CALL changeCollation('utf8');
Für weitere Details lesen Sie diesen Blog .
Wenn Sie den Standardzeichensatz für ein Schema aktualisieren möchten:
ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
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 in all tables
DB="$1"
CHARSET="$2"
COLL="$3"
[ -n "$DB" ] || exit 1
[ -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 | (
while read TABLE; 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 TO
wird ein Skript generiert, das alle Tabellen von <your-database>
in Ihre angeforderte Codierung konvertiert . Dies ändert auch die Codierung jeder Spalte !
Bessere Variante zum Generieren eines SQL-Skripts per SQL-Anforderung. Standardwerte / Nullen werden nicht ruiniert.
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.column_type,
' CHARACTER SET utf8 COLLATE utf8_general_ci',
if(t1.is_nullable='YES', ' NULL', ' NOT NULL'),
if(t1.column_default is not null, concat(' DEFAULT \'', t1.column_default, '\''), ''),
';'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'your_table_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');
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 in table
$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!";
?>}
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