Come convertire un intero set di caratteri e regole di confronto di un database MySQL in UTF-8?


459

Come posso convertire l'intero set di caratteri del database MySQL in UTF-8 e le regole di confronto in UTF-8?


22
Ai visitatori successivi: annota le domande correlate nella barra laterale e usa utf8_unicode_ci, no utf8_general_ci.
fuxia,

14
Se si desidera che il pieno supporto UTF-8 sarà probabilmente anche desidera utilizzare un set di caratteri di utf8mb4più che utf8come utf8supporta solo il piano multilingue base in contrasto con l'intera gamma. Richiede MySQL 5.5.3 o versioni successive.
Martin Steel,

4
Ho dimenticato di menzionare nel mio commento sopra, se si passa a utf8mb4è necessario passare anche a confrontoutf8mb4_unicode_ci
Martin Steel

3
Ancora meglio, regole di confronto utf8mb4_unicode_520_cio qualunque sia l'ultima versione disponibile.
Rick James,

@MartinSteel Credo che questo sia il confronto di default con quel set di caratteri.
Va

Risposte:


715

Utilizzare i comandi ALTER DATABASEe ALTER TABLE.

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Oppure, se sei ancora su MySQL 5.5.2 o precedente che non supporta UTF-8 a 4 byte, utilizza utf8invece di utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

12
La CONVERT TOtecnica presuppone che il testo sia stato correttamente memorizzato in qualche altro set di caratteri (ad esempio, latin1) e non alterato (come byte UTF-8 stipati nella colonna latin1 senza conversione in latin1).
Rick James,

1
Questo ricostruisce il tavolo rendendolo impossibile su grandi sistemi di produzione. Se è certo che solo i caratteri ASCII sono memorizzati nelle colonne latin1, è possibile modificare il set di caratteri / le regole di confronto senza ricostruire?
Andrew,

@Andrew I grandi sistemi di produzione solitamente dispongono di un DB con mirroring per la manutenzione.
BalusC,

1
cambiando il carattere impostato su utf8 cambia il mio tipo di dati da testo a testo medio. È previsto?
Jerry,

1
@Jerry Probabilmente, poiché: "Se la colonna viene convertita in utf8, ogni carattere potrebbe richiedere fino a tre byte, per una lunghezza massima possibile di 3 × 65.535 = 196.605 byte. Tale lunghezza non si adatta ai byte di lunghezza di una colonna TEXT, quindi MySQL converte il tipo di dati in MEDIUMTEXT, che è il tipo di stringa più piccolo per il quale i byte di lunghezza possono registrare un valore di 196.605. Allo stesso modo, una colonna VARCHAR potrebbe essere convertita in MEDIUMTEXT. " Modifica del set di caratteri
jabbascript

129
  1. Fai un backup!

  2. Quindi è necessario impostare i set di caratteri predefiniti sul database. Questo non converte le tabelle esistenti, imposta solo il valore predefinito per le tabelle appena create.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Quindi, dovrai convertire il set di caratteri su tutte le tabelle esistenti e le relative colonne. Ciò presuppone che i dati attuali siano effettivamente nel set di caratteri corrente. Se le tue colonne sono impostate su un set di caratteri ma i tuoi dati sono realmente archiviati in un altro, dovrai controllare il manuale di MySQL su come gestirlo.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

44
Nota: ALTER TABLE tablename SET DI CARATTERI utf8 imposta solo il set di caratteri predefinito su una tabella utilizzata per le colonne appena create. Non converte le colonne esistenti che dispongono già di un set di set di caratteri.
edicola

Avrei dovuto leggere prima il backup backup backup ... ma la mia fortuna è stata che si trovava nell'ambiente di sviluppo. quindi il mio voto va a te!
DominikAngerer,

4
@DominikAngerer: cosa si è rotto?
cic

16
Si noti che utf8_general_cinon è più consigliata la migliore pratica. Da MySQL 5.5.3 dovresti usare utf8mb4piuttosto che utf8. Entrambi si riferiscono alla codifica UTF-8, ma il precedente utf8aveva una limitazione specifica di MySQL che impediva l'uso dei caratteri numerati sopra 0xFFFD.
u01jmg3,

76

Sulla shell della riga di comando

Se sei uno della shell della riga di comando, puoi farlo molto rapidamente. Basta inserire "dbname": D

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

One-liner per semplice copia / incolla

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

2
Puoi ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
aggiungere

@ 4485670 È necessario eseguirlo sulla shell della riga di comando . Se hai solo la connessione client MySQL disponibile, usa il codice di sdfor di seguito.
Arnold Daniels,

6
Questo codice funziona alla grande, ricordati di aggiungere -h [hostname] -u [username] -p [password] dopo mysql, se necessario.
disperde il

3
Probabilmente vorrai disabilitare i controlli di chiave esterna su un sistema reale: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' 'SET DI CARATTERI utf8 COLLATE utf8_general_ci;'; mysql --uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I {} echo 'SET foreign_key_checks = 0; ALTER TABLE '{}'CONVERT A SET DI CARATTERI utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" `
Adam Nelson,

1
Non ha funzionato per me fino a quando non ho usato "mostra tabelle complete in cui Table_Type = 'BASE TABLE'" invece di "SHOW TABLES"
Brian Peterson,

68

È possibile creare sql per aggiornare tutte le tabelle con:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

Cattura l'output ed eseguilo.

La risposta di Arnold Daniels sopra è più elegante.


perché hai aggiunto due query alter table? uno non è sufficiente?
Akshay,

7
@Akshay, bella domanda. La prima query di alter-table imposta il valore predefinito per le nuove colonne e la seconda query di alter-table converte le colonne esistenti.
Unlimited

4
Cordiali saluti: secondo dev.mysql.com/doc/refman/5.5/en/alter-table.html documentazione MySQL, la versione "CONVERT TO CHARACTER SET" dell'istruzione ALTER fa entrambe le cose in un unico passaggio: "Per cambiare l'impostazione predefinita della tabella set di caratteri e tutte le colonne di caratteri (CHAR, VARCHAR, TEXT) su un nuovo set di caratteri ...
devGuy

2
Ho questo errore # 1054 - Colonna sconosciuta 'webdb_playground' in 'dove clausola' ma sono sicuro che il mio db è quello corretto
Yannis Dran,

1
@YannisDran Il tuo nome db potrebbe non essere stato in una stringa, in modo tale che WHERE TABLE_SCHEMA=webdb_playgroundti abbia dato l'errore di colonna sconosciuto ma WHERE TABLE_SCHEMA="webdb_playground"avrebbe avuto esito positivo. Qualcosa da provare nel caso qualcuno lo incontri.
jabbascript

17

Prima di procedere, assicurarsi di: aver completato un backup completo del database!

Passaggio 1: modifiche a livello di database

  • Identificazione dell'insieme di caratteri e regole di confronto del database

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
    
  • Correzione delle regole di confronto per il database

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Passaggio 2: modifiche a livello di tabella

  • Identificazione delle tabelle del database con set di caratteri o regole di confronto errati

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
    
  • Regolazione delle regole di confronto e del set di caratteri delle colonne della tabella

Cattura l'output sql superiore ed eseguilo. (come segue)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

fare riferimento a: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database


1
Attualmente questo script usa "utf8_unicode_ci" per il db ma "utf8_general_ci" per le tabelle - era intenzionale? (Penso che entrambi dovrebbero usare lo stesso set di caratteri)
gmcnaughton,

stackoverflow.com/questions/10957238/… hanno lasciato una risposta più completa qui
VH

8

Usa HeidiSQL . È gratuito e un ottimo strumento db.

Dal menu degli strumenti, immettere l'editor di tabelle in blocco

Seleziona il database completo o scegli le tabelle da convertire,

  • tick Modifica regole di confronto predefinite: utf8mb4_general_ci
  • spunta Converti in set di caratteri: utf8

Eseguire

Ciò converte il database completo dal latino all'utf8 in pochi secondi.

Funziona come un fascino :)

HeidiSQL si connette per impostazione predefinita come utf8, quindi tutti i caratteri speciali dovrebbero ora essere visti come carattere (æ ø å) e non codificati durante l'ispezione dei dati della tabella.

La vera trappola quando si passa dal latino a utf8 è assicurarsi che pdo si colleghi al set di caratteri utf8. In caso contrario, i dati della spazzatura verranno inseriti nella tabella utf8 e i punti interrogativi ovunque nella pagina Web, facendo pensare che i dati della tabella non siano utf8 ...


Potresti elaborare per favore? Ho esattamente questo problema: caratteri e spazi speciali appaiono come punti interrogativi. Sto cercando di convertire il database in MAMP usando PHPMyAdmin. Avendo sviluppato offline ora scopro che il mio host non supporta utf8mb4. Non ho Windows, quindi non posso usare HeidiSQL. C'è un modo per raggiungere questo obiettivo con PHPMyAdmin?
RexTheRunt,

in questo modo. soprattutto hai un sacco di tavolo.
tyan

Ottengo ed errore quando provo a convertire il CHARSET: Errore SQL (1025): Errore durante la ridenominazione ... ma questo è uno strumento di gestione SQL incredibile!
marcolopes

Se qualcuno ha bisogno di una buona panoramica e tutorial per heidisql, dai un'occhiata a questo articolo .
DougB,

6

Ispirato al commento di @sdfor, ecco uno script bash che fa il lavoro

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit

4

Nel caso in cui i dati non si trovino nello stesso set di caratteri, è possibile prendere in considerazione questo frammento da http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Se la colonna ha un tipo di dati non binari (CHAR, VARCHAR, TEXT), il suo contenuto deve essere codificato nel set di caratteri della colonna, non in altri set di caratteri. Se il contenuto è codificato in un set di caratteri diverso, è possibile convertire prima la colonna in modo da utilizzare un tipo di dati binario, quindi in una colonna non binaria con il set di caratteri desiderato.

Ecco un esempio:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

Assicurati di scegliere la giusta collazione, altrimenti potresti avere conflitti chiave unici. ad esempio Éleanore ed Eleanore potrebbero essere considerati uguali in alcune raccolte.

A parte:

Ho avuto una situazione in cui alcuni personaggi "si sono rotti" nelle e-mail anche se sono stati memorizzati come UTF-8 nel database. Se stai inviando e-mail utilizzando i dati utf8, potresti voler convertire anche le tue e-mail per inviarle in UTF8.

In PHPMailer, basta aggiornare questa riga: public $CharSet = 'utf-8';


4

Per i database con un numero elevato di tabelle è possibile utilizzare un semplice script php per aggiornare il set di caratteri del database e tutte le tabelle utilizzando quanto segue:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}

Da dove eseguiamo questo script?
Yannis Dran,

1
@YannisDran Non dovrebbe importare, purché l'IP da cui la esegui abbia accesso al database. Assicurati di fare prima un backup!
Dan Lucas,

Bene, e come lo eseguiamo? Dobbiamo caricarlo sul server e quindi eseguire immettere il percorso nella sua posizione?
Yannis Dran,

4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();

Grazie, questa è una delle poche risposte che in realtà mostra come farlo all'intero database (ovvero ogni tabella). Ha funzionato come un fascino.
Machisuji,

3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

3

Il modo più sicuro è modificare prima le colonne in un tipo binario e poi modificarlo nuovamente nel tipo usando il set di caratteri desiderato.

Ogni tipo di colonna ha il suo rispettivo tipo binario, come segue:

  1. CHAR => BINARY
  2. TESTO => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARY

Per esempio.:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

Ho provato in diverse tabelle latin1 e ha mantenuto tutti i segni diacritici.

È possibile estrarre questa query per tutte le colonne in questo modo:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

Dopo averlo fatto su tutte le colonne, lo fai su tutte le tabelle:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Per generare questa query per tutta la tabella, utilizzare la seguente query:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

E ora che hai modificato tutte le colonne e le tabelle, fai lo stesso sul database:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

1

Se non riesci a convertire i tuoi tavoli o il tuo tavolo è sempre impostato su un set di caratteri non utf8, ma vuoi utf8, la soluzione migliore potrebbe essere quella di cancellarlo e ricominciare da capo e specificare esplicitamente:

create database database_name character set utf8;

0

L'unica soluzione che ha funzionato per me: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Conversione di un database contenente tabelle

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

0

alter table table_name charset = 'utf8';

Questa è una semplice query che sono stato in grado di utilizzare per il mio caso, è possibile modificare table_name secondo i propri requisiti.


Normalmente una risposta dovrebbe essere accompagnata da una spiegazione di cosa suggerisci di fare.
Riggs Full

0

Per modificare la codifica del set di caratteri in UTF-8 per il database stesso, digitare il comando seguente al prompt mysql>. Sostituisci DBNAME con il nome del database:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

0

Puoi anche utilizzare lo strumento DB Navicat, che lo rende più semplice.

  • Siva.

Fare clic con il tasto destro del mouse sul database e selezionare Proprietà e modifica DB come desiderato nel menu a discesa

inserisci qui la descrizione dell'immagine


0

Soluzione da riga di comando ed Escludi visualizzazioni

Sto semplicemente completando la risposta di @ Jasny per altri come @Brianme e per chi ha viste nel nostro database.

Se hai un errore come questo:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

È perché probabilmente hai viste e devi escluderle. Ma quando si tenta di escluderli, MySQL restituisce 2 colonne anziché 1.

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

Quindi dobbiamo adattare il comando di Jasny awkper estrarre solo la prima colonna che contiene il nome della tabella.

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

One-liner per semplice copia / incolla

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

-1

Per modificare la codifica del set di caratteri in UTF-8, seguire i semplici passaggi in PHPMyAdmin

  1. Seleziona il tuo database SS

  2. Vai a Operazioni SS

  3. Nella scheda Operazioni, nel menu a discesa delle regole di confronto in basso, selezionare la codifica desiderata (utf8_general_ci) e selezionare anche la casella di controllo (1) modifica tutte le regole di confronto delle tabelle, (2) Modifica tutte le regole di confronto delle colonne delle tabelle. e premi Vai.

SS

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.