Comment puis-je voir quel jeu de caractères est une base de données / table / colonne MySQL?

Réponses:

745

Voici comment je le ferais -

Pour les schémas (ou bases de données - ce sont des synonymes):

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

Pour les tableaux:

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

Pour les colonnes:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";
Zenshai
la source
3
Il convient de noter que information_schema n'est disponible que dans MySQL 5, je crois.
Vex
4
Pour autant que je sache, le plus proche de la récupération des informations de jeu de caractères spécifiques aux colonnes dans MySQL <5 est de faire AFFICHER LES COLONNES COMPLÈTES DE tableName
Robin Winslow
14
Cette réponse a été très utile, mais si vous souhaitez résoudre un problème de jeu de caractères / classement, vous devrez probablement également vérifier la connexion de jeu de caractères, client_character_set etc ...: AFFICHER LES VARIABLES COMME 'jeu de caractères%'; AFFICHER LES VARIABLES COMME 'collation%';
BenL
2
l'opération de la table renvoie "Empty set (0.00 sec)" pour moi
minhajul
9
Pour les nuls de schéma: Notez que cela schemanamepeut simplement être le nom de la base de données.
BurninLeo
465

Pour les colonnes :

SHOW FULL COLUMNS FROM table_name;
serhat
la source
43
Bonjour, c'est l'avenir qui parle! Pour quiconque vérifie cette réponse, cette méthode affiche uniquement le classement, plutôt que le jeu de caractères. Je crois que cela a changé à MySQL 5. (Voir la réponse avec plus de points pour une meilleure méthode).
fideloper
20
@fideloper, Avec le classement, vous pouvez dire le jeu de caractères. C'est parce que la première partie du classement inclut le jeu de caractères, par exemple si le classement est latin1_swedish_ci, le jeu de caractères ne peut pas être autre chose latin1. Si le classement est utf8mb4_general_ci, le jeu de caractères ne peut pas être autre chose utf8mb4.
Pacerier
1
Cela vous indique le jeu de caractères du tableau. Il ne vous indique pas le jeu de caractères des tables créées à l'avenir quand aucun jeu de caractères n'est spécifié dans la syntaxe de création de table (vous aurez besoin du jeu de caractères du schéma pour cela).
HoldOffHunger
217

Pour les bases de données :

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

Cf. cette page . Et consultez le manuel MySQL

J. Polfer
la source
3
Cela ne répond qu'à 1/3 de la question.
Tobias J
1
@TobyJ, je ne vous vois pas vous plaindre sur stackoverflow.com/a/4805510/632951
Pacerier
ce que signifie le sigle pour cf? le lien n'existe pas cependant. @Pacerier
Yannis Dran
Cela devrait être fusionné dans la première réponse. Cela m'a vraiment aidé.
beppe9000
150

Pour toutes les bases de données que vous avez sur le serveur:

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

Production:

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

Pour une seule base de données :

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

Production:

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

Obtention du classement des tableaux :

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

OU - affichera le SQL complet pour la table de création:

mysql> show create table my_tablename


Obtenir le classement des colonnes :

mysql> SHOW FULL COLUMNS FROM my_tablename;

production:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....
Nabeel Ahmed
la source
Pour quelle version de mysql afficher cette sortie type? J'ai mysql 5.7.9 et typemontre le data typede la colonne pas le character set. Certains aiment int(10) varchar(255)... etc et pasutf8
MTK
Ma sortie montre typeaussi le data type@MTK, peut-être au-dessus est une erreur de copier-coller dans la section "sortie:".
tronmcp
65

Pour les tableaux :

SHOW TABLE STATUS listera toutes les tables.

Filtrer en utilisant:

SHOW TABLE STATUS where name like 'table_123';
Vexer
la source
9
Notez s'il vous plaît. Le classement affiché dans l'état de la table d'exposition n'est pas le jeu de caractères de la table. Le classement vous indique comment les caractères sont triés / comparés. Par exemple, utf8_bin_ci compare les données sans tenir compte de la casse (insensible à la casse, donc "m" et "M" sont les mêmes), utf8_bin_cs compare avec la casse (donc "m" et "M" sont distincts). Ce n'est pas la même chose que le jeu de caractères d'une table.
Daan
6
@Daan, Arrêtez de répandre la désinformation. Voir stackoverflow.com/questions/1049728/… , avec le classement que vous pouvez dire au jeu de caractères.
Pacerier
44

Pour les bases de données :

Utilisez simplement ces commandes:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;
DC-
la source
34
SELECT TABLE_SCHEMA,
       NOM DE LA TABLE,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       NOM DE COLONNE,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  FROM information_schema.TABLES AS T
  JOIGNEZ information_schema.COLUMNS COMME C UTILISATION (TABLE_SCHEMA, TABLE_NAME)
  REJOIGNEZ information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
       ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 O TABLE TABLE_SCHEMA = SCHEMA ()
   AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
 COMMANDER PAR TABLE_SCHEMA,
          NOM DE LA TABLE,
          NOM DE COLONNE
;
Eric
la source
2
Très gentil, Eric. Collez simplement ce code dans la ligne de commande mysql, appuyez sur retour et vous obtenez le jeu de caractères de chaque colonne de chaque table dans chaque base de données :)
Jerry Krinock
1
@JerryKrinock Vous obtenez toutes les colonnes de la base de données actuelle et rien si aucune base de données n'est sélectionnée.
Ortomala Lokni le
24

Je regarde toujours SHOW CREATE TABLE mydatabase.mytable.

Pour la base de données, il semble que vous devez regarder SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA.

le chaos
la source
3
dans les bases de données mysql peuvent avoir des jeux de caractères par défaut
James
3
select default_character_set_name from information_schema.schematan'est pas suffisant car vous ne pouvez pas savoir quelle ligne est en corrélation avec quelle base de données. Utilisez select default_character_set_name,schema_name from information_schema.schemataou simplement: select*from information_schema.schemata.
Pacerier
J'ai utilisé SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G; Et cela a très bien fonctionné :) Merci!
Sankalp
23

Pour voir le classement par défaut de la base de données:

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

Pour voir le classement du tableau:

SHOW TABLE STATUS where name like 'table_name';

Pour voir le classement des colonnes:

SHOW FULL COLUMNS FROM table_name;
user1012513
la source
21

Pour les tableaux et les colonnes :

show create table your_table_name
James
la source
2
Il vous indique le SQL complet qui serait utilisé pour créer la table telle qu'elle est actuellement, qui devrait inclure son jeu de caractères.
James
De plus, si la colonne n'indique pas un jeu de caractères particulier, alors elle utilise le jeu de caractères par défaut de la table.
Pacerier
18

Pour les bases de données :

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

Exemple de sortie:

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> 
sjas
la source
N'est-ce pas une répétition de la première réponse en haut et stackoverflow.com/a/1049753/632951 ?
Pacerier
1
@Pacerier avez-vous réellement comparé ma réponse à celles-ci correctement?
sjas
15

Pour les bases de données :

SHOW CREATE DATABASE "DB_NAME_HERE";

Lors de la création d'une base de données (MySQL), le jeu de caractères / classement par défaut est toujours LATIN, à la place que vous en avez sélectionné un autre lors de la création initiale de votre base de données

amenko
la source
3
La citation nécessaire pour "le jeu de caractères / classement par défaut est toujours LATIN" dans MySQL.
Pacerier
Citation requise? Avez-vous déjà utilisé une base de données MySQL? Tout le monde sait que le jeu de caractères / classement par défaut est latin1_swedish_cidû au fait que Monty Widenius, le créateur de MySQL, est suédois et ne pensait pas autant qu'il devrait avoir quand il a commencé.
Spencer Williams
5

Comme beaucoup l'ont écrit précédemment, SHOW FULL COLUMNS devrait être la méthode préférée pour obtenir des informations sur les colonnes. Ce qui manque, c'est un moyen d'obtenir le jeu de caractères après cela sans atteindre directement les tables de métadonnées:

SHOW FULL COLUMNS FROM my_table WHERE Field = 'my_field'
SHOW COLLATION WHERE Collation = 'collation_you_got'
WowPress.host
la source