Come posso vedere quale set di caratteri è un database / tabella / colonna MySQL?


Risposte:


744

Ecco come lo farei -

Per schemi (o database - sono sinonimi):

SELECT default_character_set_name FROM information_schema.SCHEMATA 
WHERE schema_name = "schemaname";

Per i tavoli:

SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,
       information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
  AND T.table_schema = "schemaname"
  AND T.table_name = "tablename";

Per le colonne:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";

3
Va notato che information_schema è solo in MySQL 5 in poi credo.
Vex,

4
Per quanto posso dire il più vicino puoi ottenere il recupero delle informazioni sul set di caratteri specifici della colonna in MySQL <5 è fare MOSTRA COLONNE COMPLETE DA tableName
Robin Winslow

14
Questa risposta è stata molto utile, ma se si desidera risolvere un problema relativo al set di caratteri / fascicolazione, è necessario verificare anche la connessione character_set, client_character_set ecc ...: MOSTRA VARIABILI COME 'character_set%'; MOSTRA VARIABILI COME 'collation%';
BenL,

2
l'operazione tabella restituisce "Set vuoto (0,00 sec)" per me
minhajul

9
Per Schema-Dummies: Nota, schemanamepotrebbe essere solo il nome del database.
BurninLeo,

465

Per colonne :

SHOW FULL COLUMNS FROM table_name;

43
Ciao, questo è il futuro parlando! Per chiunque controlli questa risposta, questo metodo mostra solo le regole di confronto anziché il set di caratteri. Credo che questo sia cambiato in MySQL 5. (Vedi la risposta con più punti per un metodo migliore).
fideloper,

20
@fideloper, Con le regole di confronto puoi dire il set di caratteri. Questo perché la prima parte delle regole di confronto include il set di caratteri, ad esempio se il confronto è latin1_swedish_ci, il set di caratteri non può essere altro latin1. Se il confronto è utf8mb4_general_ci, il set di caratteri non può essere altro utf8mb4.
Pacerier,

1
Questo ti dice il set di caratteri della tabella. Non ti dice il set di caratteri delle tabelle create in futuro quando non viene specificato alcun set di caratteri nella sintassi di creazione della tabella (per questo avrai bisogno del set di caratteri dello schema).
HoldOffHunger,

217

Per i database :

USE your_database_name;
show variables like "character_set_database";
-- or:
-- show variables like "collation_database";

Cf. questa pagina . E controlla il manuale di MySQL


3
Questo risponde solo a 1/3 della domanda.
Tobias J,

1
@TobyJ, non vedo che si lamentano a stackoverflow.com/a/4805510/632951
Pacerier

cosa significa cf? il link non esiste però. @Pacerier
Yannis Dran,

Questo dovrebbe essere unito nella risposta principale. Mi ha davvero aiutato.
beppe9000,

150

Per tutti i database che hai sul server:

mysql> SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;

Produzione:

+----------------------------+---------+--------------------+
| database                   | charset | collation          |
+----------------------------+---------+--------------------+
| information_schema         | utf8    | utf8_general_ci    |
| my_database                | latin1  | latin1_swedish_ci  |
...
+----------------------------+---------+--------------------+

Per un singolo database :

mysql> USE my_database;
mysql> show variables like "character_set_database";

Produzione:

    +----------------------------+---------+
    | Variable_name              |  Value  |
    +----------------------------+---------+
    | character_set_database     |  latin1 | 
    +----------------------------+---------+

Ottenere le regole di confronto per le tabelle :

mysql> USE my_database;
mysql> SHOW TABLE STATUS WHERE NAME LIKE 'my_tablename';

OPPURE - genererà l'SQL completo per la creazione della tabella:

mysql> show create table my_tablename


Ottenere le regole di confronto delle colonne :

mysql> SHOW FULL COLUMNS FROM my_tablename;

produzione:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....

Per quale versione di mysql viene mostrato questo output type? Ho mysql 5.7.9 e typemostra data typela colonna non la character set. Alcuni come int(10) varchar(255)... ecc. E nonutf8
MTK

I miei spettacoli uscita typecome data typepure @MTK, forse soprattutto è un errore di copia incolla nel "uscita:" la sezione.
tronmcp,

65

Per i tavoli :

SHOW TABLE STATUS elencherà tutte le tabelle.

Filtra usando:

SHOW TABLE STATUS where name like 'table_123';

9
Notare che. Le regole di confronto mostrate nello stato mostra tabella non sono il set di caratteri della tabella. Le regole di confronto indicano come i personaggi vengono ordinati / confrontati. es. utf8_bin_ci confronta i dati senza considerare il caso (maiuscole e minuscole, quindi "m" e "M" sono uguali), utf8_bin_cs confronta con la distinzione tra maiuscole e minuscole (quindi "m" e "M" sono distinti). Questo non è lo stesso del set di caratteri di una tabella.
Daan,

6
@Daan, smetti di diffondere disinformazione. Vedi stackoverflow.com/questions/1049728/… , con le regole di confronto si può dire il set di caratteri.
Pacerier,

44

Per i database :

Usa questi comandi:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;

34
SELEZIONA TABLE_SCHEMA,
       TABLE_NAME,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME,
       tipo_colonna,
       C.CHARACTER_SET_NAME
  DA information_schema.TABLES COME T
  UNISCITI information_schema.COLUMNS COME C USING (TABLE_SCHEMA, TABLE_NAME)
  UNISCITI information_schema.COLLATION_CHARACTER_SET_APPLICABILITY COME CCSA
       ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 DOVE TABLE_SCHEMA = SCHEMA ()
   AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
 ORDINA PER TABLE_SCHEMA,
          TABLE_NAME,
          COLUMN_NAME
;

2
Molto carino, Eric. Basta incollare quel codice nella riga di comando mysql,
premere invio

1
@JerryKrinock Ottieni tutte le colonne del database corrente e nulla se non è selezionato alcun database.
Ortomala Lokni,

24

Lo guardo sempre e basta SHOW CREATE TABLE mydatabase.mytable.

Per il database, sembra che tu debba guardare SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA.


3
nei database mysql possono avere set di caratteri predefiniti
James,

3
select default_character_set_name from information_schema.schematanon è sufficiente perché non è possibile stabilire quale riga sia correlata a quale database. Utilizzare select default_character_set_name,schema_name from information_schema.schematao semplicemente: select*from information_schema.schemata.
Pacerier,

Ho usato SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G; E ha funzionato benissimo :) Grazie!
Sankalp,

23

Per visualizzare le regole di confronto predefinite del database:

USE db_name;
SELECT @@character_set_database, @@collation_database;

Per visualizzare le regole di confronto della tabella:

SHOW TABLE STATUS where name like 'table_name';

Per visualizzare le regole di confronto delle colonne:

SHOW FULL COLUMNS FROM table_name;

21

Per tabelle e colonne :

show create table your_table_name

2
Ti dice l'intero SQL che verrebbe usato per creare la tabella così com'è attualmente, che dovrebbe includere il suo set di caratteri.
James,

Inoltre, se la colonna non indica un set di caratteri particolare, utilizza il set di caratteri predefinito della tabella.
Pacerier,

18

Per i database :

SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;

Esempio di output:

mysql> SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;
+----------------------------+---------+--------------------+
| database                   | charset | collation          |
+----------------------------+---------+--------------------+
| information_schema         | utf8    | utf8_general_ci    |
| drupal_demo1               | utf8    | utf8_general_ci    |
| drupal_demo2               | utf8    | utf8_general_ci    |
| drupal_demo3               | utf8    | utf8_general_ci    |
| drupal_demo4               | utf8    | utf8_general_ci    |
| drupal_demo5               | latin1  | latin1_swedish_ci  |

...

+----------------------------+---------+--------------------+
55 rows in set (0.00 sec)

mysql> 

Questa non è una ripetizione della prima risposta in alto e stackoverflow.com/a/1049753/632951 ?
Pacerier,

1
@Pacerier hai effettivamente confrontato la mia risposta a questi correttamente?
sjas,

15

Per i database :

SHOW CREATE DATABASE "DB_NAME_HERE";

Nella creazione di un database (MySQL), il set di caratteri / regole di confronto predefiniti è sempre LATINO, invece di averne selezionato uno diverso nella creazione iniziale del database


3
La citazione necessaria per "set di caratteri predefinito / regole di confronto è sempre LATINA" in MySQL.
Pacerier,

Citazione necessaria? Hai mai usato un database MySQL? Tutti sanno che il set di caratteri / le regole di confronto predefinite è latin1_swedish_ciperché Monty Widenius, il creatore di MySQL, è svedese e non pensava al grande quadro come avrebbe dovuto iniziare.
Spencer Williams,

5

Come molti hanno scritto in precedenza, SHOW FULL COLUMNS dovrebbe essere il metodo preferito per ottenere informazioni sulla colonna. Ciò che manca è un modo per ottenere il set di caratteri dopo quello senza raggiungere direttamente le tabelle dei metadati:

SHOW FULL COLUMNS FROM my_table WHERE Field = 'my_field'
SHOW COLLATION WHERE Collation = 'collation_you_got'
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.