Wie ändere ich die Sortierung von Datenbank, Tabelle, Spalte?

200

Die Datenbank ist latin1_general_cijetzt 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?

user158469
quelle
3
Siehe hier für die Antwort: stackoverflow.com/questions/5906585/…
Timo Huovinen

Antworten:

257

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 latin1und importieren Sie sie zurück mit utf8mb4.

Quassnoi
quelle
15
Aber ich möchte die Sortierung von Spalten ändern. Dies wird nur die Tabellensortierung ändern ..
user158469
7
@rsensan: CONVERTändert auch die Sortierung von Spalten.
Quassnoi
21
ALTER database SCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Stormwild
8
@stormwild: Dies hat keine Auswirkungen auf vorhandene Tabellen
Quassnoi
47
Meine Anfrage: ALTER TABLE MYTABLECONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Bitte benutze utf8_general_ci nicht mehr ;-)
Kapitein Witbaard
209

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;
Nabeel Ahmed
quelle
15
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!";
                ?>
hkasera
quelle
43

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.

Jeeva
quelle
Vielen Dank, das war hilfreich
JoZ3
15

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');
Parampal Pooni
quelle
+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

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
Jewgenij Afanasjew
quelle
5

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";
Dzintars
quelle
4

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();

?>
mtmehdi
quelle
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!";
Chandra Kumar
quelle
4

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.

Skriptschaltflächen verbinden

Adam Nofsinger
quelle
3

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 .

András Ottó
quelle
2

Wenn Sie den Standardzeichensatz für ein Schema aktualisieren möchten:

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
Mircea Stanciu
quelle
1

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
)
Petr Stastny
quelle
1

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 !

Florian Kirmaier
quelle
1

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');
Max Ivanov
quelle
0

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.

Kickoff3pm
quelle
0

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!";

?>}
Kim Michael
quelle
-1

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

Durcheinander
quelle