2009-08-18 10 views
135

Jetzt ist die Datenbank latin1_general_ci und ich möchte die Sortierung in utf8_general_ci ändern. Gibt es in PhpMyAdmin eine Einstellung, um die Sortierung von Datenbank, Tabelle und Spalte zu ändern? Anstatt sich einzeln zu ändern?Wie ändert man die Sortierung von Datenbank, Tabelle, Spalte?

+2

Sehen Sie diese für die Antwort ein: http://stackoverflow.com/questions/5906585/how-to-change-the-default-collation-of-a-database/9531221#9531221 –

Antwort

188

Sie müssen entweder jede Tabelle konvertieren individuell:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8 

(dies die Spalten konvertieren genauso gut) oder die Datenbank exportieren mit latin1 und importieren Sie es mit utf8 zurück.

+6

Aber ich will Sortierung der Spalten ändern Dies ändert nur die Tabellenkollation. – user158469

+6

'@ rsensan':' CONVERT' ändert auch die Kollatierung von Spalten. – Quassnoi

+0

Es kann mit PHP-Skript gemacht werden. – hkasera

60

Sie können Führen Sie ein PHP-Skript aus.

   <?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!"; 
       ?> 
+0

vielen Dank bro. :) –

+0

Gute Arbeit. Gespeichertes Leben ... Danke –

33

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

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8 

Standardsortierung für die gesamte Datenbank einzustellen,

ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin 

oder sonst,

Goto PhpMyAdmin -> Operationen-> Sortierung.

Dort finden Sie die Auswahlbox, die alle vorhandenen Sortierungen enthält. Hier können Sie Ihre Sortierung ändern. Nach der Datenbanktabelle folgt diese Kollatierung, während Sie eine neue Spalte erstellen. Es ist nicht erforderlich, beim Erstellen neuer Spalten eine Sortierung auszuwählen.

+0

Vielen Dank, das war hilfreich – JoZ3

3

Sie können die CHARSET und COLLATION aller Ihrer Tabellen durch 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 derselbe, 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 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

ich es hier zu lesen, dass Sie jede Tabelle manuell konvertieren müssen, ist es nicht wahr. Hier ist eine Lösung, wie sie mit einer gespeicherten Prozedur zu tun:

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 ; 

Nach dem Verfahren erzeugt wird, nennt es einfach:

CALL changeCollation('utf8’); 

Für weitere Informationen lesen Sie blog.

9

Wenn Sie phpMyAdmin ausführen >> wählen Sie Datenbank >> wählen Sie Tabelle >> gehen Sie auf "Operationen" Registerkarte >> in "Tabellenoptionen" Abschnitt >> Sie können Sortieren aus der Dropdown-Liste >> und drücken Sie einmal { gehen} am oberen Rand des Bildschirms eine Meldung angezeigt wird:

Ihre SQL-Abfrage erfolgreich ausgeführt wurde

und ein Skript

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

Aber es wird die Sortierungen der vorhandenen Spalten NICHT ändern. Dazu können Sie dieses Skript verwenden (dies kam auch von phpMyAdmin)

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

Schnell Art und Weise - Export in SQL-Datei, verwenden Sie zum Suchen und Ersetzen Sie den Text ändern, ändern müssen. Erstellen Sie eine neue Datenbank, importieren Sie die Daten und benennen Sie dann die alte und die neue Datenbank in den alten Namen um.

5

Die folgende Abfrage generiert ALTER-Abfragen, die die Sortierung für alle geeigneten Spalten in allen Tabellen auf 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'); 
3

Sie können einfach fügen Sie diesen Code zu Skriptdatei

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

ich einen Beitrag hier, wie die OP fragte:

Wie Sortierungs der Datenbank, Tabelle, Spalte ändern ?

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


es Datenbank breit ändern:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Ändern es pro Tisch:

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

Gute Praxis ist es auf Tabellenebene zu ändern, wie sie es für Spalten ändern werden auch . Die Änderung für eine bestimmte Spalte gilt für jeden spezifischen Fall.

Ändern Sortierung für eine bestimmte Spalte:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
+3

Dieser beantwortet die Frage direkt. Ich brauchte das, da meine Änderungen auf Tabellenebene die Spalten NICHT aktualisierten. Ich werde das später untersuchen; aber das ist die Information, die mich durch die schweren Zeiten gebracht hat. Vielen Dank. – Parapluie

+3

Die beste Antwort dafür. – jubi4dition

3

Ich war überrascht, zu erfahren, und so musste ich wieder hierher kommen und berichten, dass der ausgezeichneten und gut Verbindungen/it Safe Search beibehalten UND AUF DATABASE REPLACE Skript hat einige Optionen zum Konvertieren von Tabellen in utf8/unicode und sogar zum Umwandeln in innodb. Es ist ein Skript, das häufig verwendet wird, um eine datenbankgestützte Website (Wordpress, Drupal, Joomla usw.) von einer Domäne in eine andere zu migrieren.

interconnect script buttons

1

, wenn Sie den Standard-Zeichensatz auf einem Schema aktualisieren:

ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci; 
1

Ich benutzen den folgenden Shell-Skript. Er übernimmt den Datenbanknamen als Parameter und konvertiert alle Tabellen in einen anderen Zeichensatz und eine andere Kollatierung (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 
) 
0

Führen Sie einfach diese SQL. Ändern Sie Ihre COLLATION in was Sie benötigen und databaseName.

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"; 
Verwandte Themen