it-swarm.com.de

Wie kann die Sortierung von Datenbank, Tabelle oder Spalte geändert werden?

Die Datenbank ist jetzt latin1_general_ci und ich möchte die Sortierung in utf8mb4_general_ci ändern.

Gibt es in PhpMyAdmin eine Einstellung zum Ändern der Sortierung von Datenbank, Tabelle oder Spalte? Statt nacheinander zu wechseln?

164
user158469

Sie müssen jede Tabelle einzeln konvertieren:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 

(Dies konvertiert die Spalten genauso gut) oder Sie exportieren die Datenbank mit latin1 und importieren sie mit utf8mb4 zurück.

221
Quassnoi

Ich trage hier mit, als das OP fragte:

Wie kann die Sortierung von Datenbank, Tabelle, Spalte geändert werden?

Die ausgewählte Antwort gibt es nur auf Tabellenebene an.


Datenbankweit ändern:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Ändern Sie es pro Tabelle:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Es ist empfehlenswert, sie auf Tabellenebene zu ändern, da sie auch für Spalten geändert wird. Das Ändern einer bestimmten Spalte ist für jeden spezifischen Fall.

Ändern der Sortierung für eine bestimmte Spalte:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
120
Nabeel Ahmed

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!";
                ?>
62
hkasera

Um die Sortierung für Tabellen einzeln zu ändern, können Sie

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8

So legen Sie die Standardkollatierung für die gesamte Datenbank fest

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

oder aber, 

Gehe zu PhpMyAdmin-> Vorgänge-> Sortierung.  

Dort finden Sie die Auswahlbox, die alle vorhandenen Kollatierungen enthält. Damit Sie hier Ihre Kollatierung ändern können. Hier folgt also nach der Datenbanktabelle diese Sortierung, während Sie eine neue Spalte erstellen. Bei der Erstellung neuer Spalten müssen Sie keine Sortierfolge auswählen.

37
jeeva

sie können die Standard-Kollatierung auf mehreren Ebenen festlegen:

http://dev.mysql.com/doc/refman/5.0/de/charset-syntax.html

1) Client 2) Server-Standard 3) Datenbank-Standard 4) Tabellen-Standard 5) Spalte

9
andersonbd1

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 folgenden Beispiel).

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

Wenn Sie phpMyAdmin ausführen >> Datenbank auswählen >> Tabelle auswählen >> gehen Sie zur Registerkarte "Operationen" >> im Abschnitt "Tabellenoptionen" >>, und Sie können Collation aus der Dropdown-Liste auswählen Oben auf dem Bildschirm sehen Sie eine Nachricht: 

Ihre SQL-Abfrage wurde erfolgreich ausgeführt 

und ein Skript 

ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

Es werden jedoch NICHT die Kollatierungen vorhandener Spalten geändert .. Um dies zu tun, können Sie dieses Skript verwenden (dieses Skript stammt ebenfalls von phpMyAdmin).

ALTER TABLE  `tableName` CHANGE  `Name`  `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
9

Ich war überrascht zu erfahren, und so musste ich hierher zurückkommen und berichten, dass das ausgezeichnete und gut gewartete Skript Interconnect/SAFE SEARCH AND REPLACE ON DATABASE einige Optionen zum Konvertieren von Tabellen in utf8/Unicode und sogar zum Konvertieren in innodb aufweist . Hierbei handelt es sich um ein Skript, das üblicherweise zum Migrieren einer datenbankgestützten Website (Wordpress, Drupal, Joomla usw.) von einer Domäne zur anderen verwendet wird.

 interconnect script buttons

4
Adam Nofsinger

Sie können CHARSET und COLLATION aller Ihrer Tabellen mit dem Skript PHP wie folgt ändern. Ich mag die Antwort von hkasera, aber das Problem ist, dass die Abfrage in jeder Tabelle zweimal ausgeführt wird. Dieser Code ist fast derselbe, außer dass MySqli anstelle von MySQL verwendet wird und Doppelabfragen verhindert werden. Wenn ich wählen könnte, hätte ich die Antwort von hkasera gewählt.

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

?>
3
mtmehdi

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!";
3
Chandra Kumar

Ich habe hier gelesen, dass Sie jede Tabelle manuell konvertieren müssen, es stimmt nicht. Hier ist eine Lösung, wie mit einer gespeicherten Prozedur umzugehen ist:

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 dieses blog .

3
András Ottó

wenn Sie den Standardzeichensatz eines Schemas aktualisieren möchten:

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

Führen Sie einfach diese SQL aus. Ändern Sie Ihre COLLATION in das, was Sie brauchen, und den Datenbanknamen.

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";
1
Dzintars

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

Schneller Weg - in eine SQL-Datei exportieren, Suchen und Ersetzen verwenden, 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.

0
kickoff3pm

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 Kodierung konvertiert. Dies ändert auch die Kodierung von jeder Spalte !

0

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 ist hier verfügbar: https://github.com/Juddling/mysql-charset

0
Juddling