¿Cómo veo qué conjunto de caracteres es una base de datos / tabla / columna de MySQL?

Respuestas:

745

Así es como lo haría:

Para esquemas (o bases de datos, son sinónimos):

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

Para tablas:

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

Para columnas:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";
Zenshai
fuente
3
Cabe señalar que information_schema solo está en MySQL 5 en adelante, creo.
Vex
44
Por lo que puedo decir, lo más cerca que puede llegar a recuperar información específica del conjunto de caracteres de la columna en MySQL <5 es hacer MOSTRAR COLUMNAS COMPLETAS DE tableName
Robin Winslow
14
Esta respuesta fue muy útil, pero si desea solucionar un problema de character_set / collation, probablemente también deba verificar la conexión character_set, client_character_set, etc ...: MOSTRAR VARIABLES COMO 'character_set%'; MOSTRAR VARIABLES COMO 'colación%';
BenL
2
la operación de la tabla me devuelve "Conjunto vacío (0.00 seg)"
minhajul
99
Para Schema-Dummies: Tenga en cuenta que schemanamepuede ser el nombre de la base de datos.
BurninLeo
465

Para columnas :

SHOW FULL COLUMNS FROM table_name;
serhat
fuente
43
Hola, este es el futuro hablando! Para cualquiera que verifique esta respuesta, este método solo muestra Colación, en lugar de conjunto de caracteres. Creo que esto cambió en MySQL 5. (Ver respuesta con más puntos para un mejor método).
fideloper
20
@fideloper, con la recopilación puedes decirle al juego de caracteres. Esto se debe a que la primera parte de la clasificación incluye el conjunto de caracteres, por ejemplo, si la clasificación es latin1_swedish_ci, el conjunto de caracteres no puede ser otra cosa además latin1. Si la recopilación es utf8mb4_general_ci, el juego de caracteres no puede ser otra cosa además utf8mb4.
Pacerier
1
Esto le indica el conjunto de caracteres de la tabla. No le indica el conjunto de caracteres de las tablas creadas en el futuro cuando no se especifica ningún conjunto de caracteres en la sintaxis de crear tabla (necesitará el conjunto de caracteres del esquema para eso).
HoldOffHunger
217

Para bases de datos :

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

Cf. esta página . Y mira el manual de MySQL

J. Polfer
fuente
3
Esto solo responde a 1/3 de la pregunta.
Tobias J
1
@TobyJ, no te veo quejarse en stackoverflow.com/a/4805510/632951
Pacerier el
¿Qué significa cf? aunque el enlace no existe. @Pacerier
Yannis Dran
Esto debería fusionarse en la respuesta superior. Realmente me ayudó.
beppe9000
150

Para todas las bases de datos que tiene en el servidor:

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

Salida:

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

Para una sola base de datos :

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

Salida:

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

Obteniendo la clasificación para las tablas :

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

O: generará el SQL completo para crear la tabla:

mysql> show create table my_tablename


Obteniendo la colación de columnas :

mysql> SHOW FULL COLUMNS FROM my_tablename;

salida:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....
Nabeel Ahmed
fuente
¿Para qué versión de mysql se muestra esta salida type? Tengo mysql 5.7.9 y typemuestro el data typede la columna, no el character set. A algunos les gusta int(10) varchar(255)... etc. y noutf8
MTK
Mi salida también se muestra typecomo data type@MTK, tal vez arriba es un error de copiar y pegar en la sección "salida:".
tronmcp
65

Para mesas :

SHOW TABLE STATUS enumerará todas las tablas.

Filtrar usando:

SHOW TABLE STATUS where name like 'table_123';
Vejar
fuente
99
Tenga en cuenta. La clasificación que se muestra en el estado de la tabla show no es el conjunto de caracteres de la tabla. La clasificación te dice cómo se ordenan / comparan los personajes. por ejemplo, utf8_bin_ci compara los datos sin tener en cuenta el caso (no distingue entre mayúsculas y minúsculas, por lo que "m" y "M" son lo mismo), utf8_bin_cs se compara con mayúsculas y minúsculas (por lo que "m" y "M" son distintos). Esto no es lo mismo que el conjunto de caracteres de una tabla.
Daan
66
@Daan, deja de difundir información errónea. Consulte stackoverflow.com/questions/1049728/… , con la recopilación puede decirle al juego de caracteres.
Pacerier
44

Para bases de datos :

Solo usa estos comandos:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;
CORRIENTE CONTINUA-
fuente
34
SELECCIONE TABLE_SCHEMA,
       NOMBRE DE LA TABLA,
       CCSA.CHARACTER_SET_NAME COMO DEFAULT_CHAR_SET,
       COLUMN_NAME
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  DE information_schema.TABLES AS T
  ÚNETE a information_schema.COLUMNS COMO C USING (TABLE_SCHEMA, TABLE_NAME)
  ÚNETE a information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
       ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 WHERE TABLE_SCHEMA = SCHEMA ()
   Y C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
 ORDENAR POR TABLE_SCHEMA,
          NOMBRE DE LA TABLA,
          COLUMN_NAME
;
Eric
fuente
2
Muy bien, Eric. Simplemente pegue ese código en la línea de comando de mysql,
presione Intro
1
@JerryKrinock Obtiene todas las columnas de la base de datos actual y nada si no se selecciona ninguna base de datos.
Ortomala Lokni
24

Siempre solo miro SHOW CREATE TABLE mydatabase.mytable.

Para la base de datos, parece que debe mirar SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA.

caos
fuente
3
en las bases de datos MySQL pueden tener conjuntos de caracteres por defecto
James
3
select default_character_set_name from information_schema.schematano es suficiente porque no puede decir qué fila se correlaciona con qué base de datos. Utilizar select default_character_set_name,schema_name from information_schema.schematao simplemente: select*from information_schema.schemata.
Pacerier
Lo usé SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G; y funcionó genial :) ¡Gracias!
Sankalp
23

Para ver la clasificación predeterminada de la base de datos:

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

Para ver la clasificación de la tabla:

SHOW TABLE STATUS where name like 'table_name';

Para ver la clasificación de las columnas:

SHOW FULL COLUMNS FROM table_name;
usuario1012513
fuente
21

Para tablas y columnas :

show create table your_table_name
James
fuente
2
Le indica el SQL completo que se usaría para crear la tabla tal como está actualmente, que debe incluir su conjunto de caracteres.
James
Además, si la columna no indica un conjunto de caracteres en particular, entonces está utilizando el conjunto de caracteres predeterminado de la tabla.
Pacerier
18

Para bases de datos :

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

Salida de ejemplo:

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
fuente
1
@Pacerier, ¿comparaste mi respuesta con estas correctamente?
sjas
15

Para bases de datos :

SHOW CREATE DATABASE "DB_NAME_HERE";

Al crear una base de datos (MySQL), el conjunto de caracteres / clasificación predeterminados siempre es LATINO, en lugar de que haya seleccionado uno diferente al crear inicialmente su base de datos

amenko
fuente
3
La cita necesaria para "conjunto de caracteres predeterminado / clasificación es siempre LATINA" en MySQL
Pacerier
Cita necesaria? ¿Alguna vez ha usado una base de datos MySQL? Todo el mundo sabe que el conjunto de caracteres / clasificación predeterminados se latin1_swedish_cidebe a que Monty Widenius, el creador de MySQL, es sueco y no estaba pensando en Big Picture como debería tener cuando comenzó.
Spencer Williams
5

Como muchos escribieron anteriormente, SHOW FULL COLUMNS debería ser el método preferido para obtener información de la columna. Lo que falta es una forma de obtener charset después de eso sin llegar directamente a las tablas de metadatos:

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