Jak zmienić sortowanie bazy danych, tabeli, kolumny?
Wybrana odpowiedź podaje ją tylko na poziomie stołu.
Zmiana całej bazy danych:
ALTERDATABASE<database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Zmiana według tabeli:
ALTERTABLE<table_name>CONVERTTO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Dobrą praktyką jest zmiana go na poziomie tabeli, ponieważ zmieni się on również dla kolumn. Zmiana na konkretną kolumnę dotyczy dowolnego konkretnego przypadku.
Zmienianie sortowania dla określonej kolumny:
ALTERTABLE<table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ten faktycznie odpowiada na pytanie bezpośrednio. Potrzebowałem tego, ponieważ moje zmiany na poziomie tabeli NIE aktualizowały kolumn. Zbadam to później; ale to informacje sprawiły, że przeżyłem ciężkie czasy. Dzięki.
Parapluie
9
Najlepsza odpowiedź na to pytanie.
jubi4dition
Tak, musisz określić typ kolumny. Oto magiczne polecenie, aby uzyskać wszystkie typy. Za pomocą edycji wieloliniowej możesz wygenerować polecenie aktualizacji wszystkich kolumn jednocześnie, zaczynając tutaj: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,
W przypadku pojedynczej kolumny możesz po prostu: ALTER TABLE nazwa_tabeli ZMIEŃ nazwę_ kolumny VARCHAR (45) COLLATE utf8mb4_bin;
TomoMiha
68
Możesz uruchomić skrypt php.
<?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!";?>
Aby zmienić sortowanie tabel indywidualnie, możesz użyć,
ALTERTABLE mytable CONVERTTO CHARACTER SET utf8
Aby ustawić domyślne sortowanie dla całej bazy danych,
ALTERDATABASE`databasename`DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
albo,
Idź do PhpMyAdmin-> Operacje-> Sortowanie.
Tam znajdziesz pole wyboru, które zawiera wszystkie wychodzące zestawienia. Abyś mógł tutaj zmienić swoje zestawienie. Tak więc tutaj po tabeli bazy danych nastąpi śledzenie tego sortowania podczas tworzenia nowej kolumny. Nie trzeba wybierać sortowania podczas tworzenia nowych kolumn.
Poniższe zapytanie wygeneruje zapytania ALTER, które zmieniają sortowanie dla wszystkich odpowiednich kolumn we wszystkich tabelach na określony typ (utf8_general_ci w moim przykładzie poniżej).
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 Najbardziej podoba mi się ta odpowiedź. Nie każdy ma gdzieś magicznie PHP. Niektórzy używają innych języków w MySQL. To było łatwe do uruchomienia w MySQL Workbench, skopiuj wiersze i wklej. Zrobiłem tylko dodatkowy krok, aby uruchomić powyższe information_schema.tablesi kod w concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Pierre
1
W ten sposób usuwane są błędy (średnich / długich) typów kolumn tekstowych, które muszą być czyszczone ręcznie
stiebrs
11
Jeśli uruchomisz phpMyAdmin >> wybierz bazę danych >> wybierz tabelę >> przejdź do zakładki „Operacje” >> w sekcji „Opcje tabeli” >> możesz wybrać Sortowanie z rozwijanej listy >> i po naciśnięciu {Go} na u góry ekranu zobaczysz komunikat:
Twoje zapytanie SQL zostało wykonane pomyślnie
i skrypt
ALTERTABLE`tableName`CONVERTTO CHARACTER SET utf8 COLLATE utf8_general_ci
Ale to NIE zmieni zestawień istniejących kolumn. Aby to zrobić, możesz użyć tego skryptu (ten również pochodzi z phpMyAdmin)
ALTERTABLE`tableName` CHANGE `Name``Name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOTNULL
Możesz zmienić CHARSET i COLLATION wszystkich swoich tabel za pomocą skryptu PHP w następujący sposób. Podoba mi się odpowiedź hkasera, ale problem polega na tym, że zapytanie jest uruchamiane dwukrotnie w każdej tabeli. Ten kod jest prawie taki sam, z wyjątkiem używania MySqli zamiast mysql i zapobiegania podwójnym zapytaniom. Gdybym mógł głosować, głosowałbym za odpowiedzią hkasery.
<?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();?>
To działało na mnie idealnie, po uaktualnieniu do Zabbix 5. Wystarczy powiedzieć, że zmienił Charset i Sortowanie takiego: CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin.
robe007
4
Możesz po prostu dodać ten kod do pliku skryptu
//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!";
Zaskoczyło mnie to, dlatego musiałem tu wrócić i zgłosić, że doskonały i dobrze utrzymany skrypt Interconnect / it SAFE SEARCH AND REPLACE ON DATABASE ma kilka opcji konwersji tabel na utf8 / unicode, a nawet konwersji na innodb . Jest to skrypt powszechnie używany do migracji strony internetowej opartej na bazie danych (Wordpress, Drupal, Joomla itp.) Z jednej domeny do drugiej.
Przeczytałem tutaj, że musisz przekonwertować każdą tabelę ręcznie, to nieprawda. Oto rozwiązanie, jak to zrobić za pomocą procedury składowanej:
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 ;
Po utworzeniu procedury wywołaj ją po prostu:
CALL changeCollation('utf8');
Aby uzyskać więcej informacji, przeczytaj ten blog .
Użyłem następującego skryptu powłoki. Pobiera nazwę bazy danych jako parametr i konwertuje wszystkie tabele na inny zestaw znaków i zestawianie (podane przez inne parametry lub wartość domyślną zdefiniowaną w skrypcie).
#!/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
)
Moje rozwiązanie to połączenie @Dzintars i @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";
Za pomocą CONVERT TOtego generuje skrypty, które konwertują wszystkie tabele <your-database>na żądane kodowanie. To również zmienia kodowanie każdej kolumny !
Szybki sposób - wyeksportuj do pliku SQL, użyj wyszukiwania i zamień, aby zmienić tekst, który chcesz zmienić. Utwórz nową bazę danych, zaimportuj dane, a następnie zmień nazwę starej bazy danych i nowej na starą nazwę.
Aby zmienić układanie wszystkich pól we wszystkich tabelach bazy danych jednocześnie:
Właśnie dodałem kolejną pętlę dla pól w tabelach do rozwiązania za pośrednictwem Php wcześniej wspomnianego. Pomogło to, wszystkie pola w tabelach są również konwertowane.
<?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!";?>}
Odpowiedzi:
Musisz przekonwertować każdą tabelę osobno:
(spowoduje to również konwersję kolumn) lub wyeksportuje bazę danych
latin1
i zaimportuje ją z powrotemutf8mb4
.źródło
@rsensan
:CONVERT
zmieni również układ kolumn.database
DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;MYTABLE
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Proszę nie używać już utf8_general_ci ;-)Przyczyniam się tutaj, jak OP poprosił:
Wybrana odpowiedź podaje ją tylko na poziomie stołu.
Zmiana całej bazy danych:
Zmiana według tabeli:
Dobrą praktyką jest zmiana go na poziomie tabeli, ponieważ zmieni się on również dla kolumn. Zmiana na konkretną kolumnę dotyczy dowolnego konkretnego przypadku.
Zmienianie sortowania dla określonej kolumny:
źródło
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');
Możesz uruchomić skrypt php.
źródło
Aby zmienić sortowanie tabel indywidualnie, możesz użyć,
Aby ustawić domyślne sortowanie dla całej bazy danych,
albo,
Idź do PhpMyAdmin-> Operacje-> Sortowanie.
Tam znajdziesz pole wyboru, które zawiera wszystkie wychodzące zestawienia. Abyś mógł tutaj zmienić swoje zestawienie. Tak więc tutaj po tabeli bazy danych nastąpi śledzenie tego sortowania podczas tworzenia nowej kolumny. Nie trzeba wybierać sortowania podczas tworzenia nowych kolumn.
źródło
Poniższe zapytanie wygeneruje zapytania ALTER, które zmieniają sortowanie dla wszystkich odpowiednich kolumn we wszystkich tabelach na określony typ (utf8_general_ci w moim przykładzie poniżej).
źródło
information_schema.tables
i kod w concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Jeśli uruchomisz phpMyAdmin >> wybierz bazę danych >> wybierz tabelę >> przejdź do zakładki „Operacje” >> w sekcji „Opcje tabeli” >> możesz wybrać Sortowanie z rozwijanej listy >> i po naciśnięciu {Go} na u góry ekranu zobaczysz komunikat:
i skrypt
Ale to NIE zmieni zestawień istniejących kolumn. Aby to zrobić, możesz użyć tego skryptu (ten również pochodzi z phpMyAdmin)
źródło
możesz ustawić domyślne sortowanie na kilku poziomach:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1) klient 2) domyślny serwer 3) domyślna baza danych 4) domyślna tabela 5) kolumna
źródło
Wystarczy uruchomić ten SQL, aby przekonwertować wszystkie tabele bazy danych jednocześnie. Zmień COLLATION i databaseName na to, czego potrzebujesz.
źródło
Możesz zmienić CHARSET i COLLATION wszystkich swoich tabel za pomocą skryptu PHP w następujący sposób. Podoba mi się odpowiedź hkasera, ale problem polega na tym, że zapytanie jest uruchamiane dwukrotnie w każdej tabeli. Ten kod jest prawie taki sam, z wyjątkiem używania MySqli zamiast mysql i zapobiegania podwójnym zapytaniom. Gdybym mógł głosować, głosowałbym za odpowiedzią hkasery.
źródło
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
.Możesz po prostu dodać ten kod do pliku skryptu
źródło
Zaskoczyło mnie to, dlatego musiałem tu wrócić i zgłosić, że doskonały i dobrze utrzymany skrypt Interconnect / it SAFE SEARCH AND REPLACE ON DATABASE ma kilka opcji konwersji tabel na utf8 / unicode, a nawet konwersji na innodb . Jest to skrypt powszechnie używany do migracji strony internetowej opartej na bazie danych (Wordpress, Drupal, Joomla itp.) Z jednej domeny do drugiej.
źródło
Przeczytałem tutaj, że musisz przekonwertować każdą tabelę ręcznie, to nieprawda. Oto rozwiązanie, jak to zrobić za pomocą procedury składowanej:
Po utworzeniu procedury wywołaj ją po prostu:
Aby uzyskać więcej informacji, przeczytaj ten blog .
źródło
jeśli chcesz zaktualizować domyślny zestaw znaków w schemacie:
źródło
Użyłem następującego skryptu powłoki. Pobiera nazwę bazy danych jako parametr i konwertuje wszystkie tabele na inny zestaw znaków i zestawianie (podane przez inne parametry lub wartość domyślną zdefiniowaną w skrypcie).
źródło
Moje rozwiązanie to połączenie @Dzintars i @Quassnoi Answer.
Za pomocą
CONVERT TO
tego generuje skrypty, które konwertują wszystkie tabele<your-database>
na żądane kodowanie. To również zmienia kodowanie każdej kolumny !źródło
Lepszy wariant do generowania skryptu SQL na żądanie SQL. Nie zrujnuje wartości domyślnych / zerowych.
źródło
Szybki sposób - wyeksportuj do pliku SQL, użyj wyszukiwania i zamień, aby zmienić tekst, który chcesz zmienić. Utwórz nową bazę danych, zaimportuj dane, a następnie zmień nazwę starej bazy danych i nowej na starą nazwę.
źródło
Aby zmienić układanie wszystkich pól we wszystkich tabelach bazy danych jednocześnie:
Właśnie dodałem kolejną pętlę dla pól w tabelach do rozwiązania za pośrednictwem Php wcześniej wspomnianego. Pomogło to, wszystkie pola w tabelach są również konwertowane.
źródło
Właśnie napisałem skrypt bash, aby znaleźć wszystkie tabele w danej bazie danych i ukryć je (i jego kolumny).
Skrypt jest dostępny tutaj: https://github.com/Juddling/mysql-charset
źródło