Como vejo o conjunto de caracteres de um banco de dados / tabela / coluna MySQL?

Respostas:

744

Aqui está como eu faria isso -

Para esquemas (ou bancos de dados - são sinônimos):

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

Para tabelas:

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 colunas:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";
Zenshai
fonte
3
Deve-se notar que o information_schema está apenas no MySQL 5 em diante, acredito.
Vex
4
Tanto quanto eu posso dizer o mais próximo que você pode começar a recuperar informações coluna específica conjunto de caracteres no MySQL <5 é fazer colunas mostram completo a partir tableName
Robin Winslow
14
Esta resposta foi muito útil, mas se você quiser solucionar um problema de conjunto de caracteres / agrupamento, provavelmente também precisará verificar a conexão conjunto de caracteres, conjunto de caracteres do cliente etc ...: MOSTRAR VARIÁVEIS COMO 'character_set%'; MOSTRAR VARIÁVEIS COMO '% de intercalação';
BenL
2
a tabela de operação retorna "Empty set (0.00 sec)" para mim
minhajul
9
Para esquemas-esquemas: Observe que esse schemanamepode ser apenas o nome do banco de dados.
BurninLeo
465

Para colunas :

SHOW FULL COLUMNS FROM table_name;
serhat
fonte
43
Olá, este é o futuro falando! Para qualquer pessoa que marque esta resposta, esse método mostra apenas Agrupamento, em vez de conjunto de caracteres. Eu acredito que isso mudou no MySQL 5. (Veja a resposta com mais pontos para um método melhor).
Fideloper 28/01
20
@ fideloper, Com o agrupamento você pode dizer o conjunto de caracteres. Isso ocorre porque a primeira parte do agrupamento inclui o conjunto de caracteres, por exemplo, se o agrupamento é latin1_swedish_ci, o conjunto de caracteres não pode ser outra coisa além disso latin1. Se o agrupamento for utf8mb4_general_ci, o conjunto de caracteres não poderá ser outra coisa além disso utf8mb4.
Pacerier 20/08/2015
1
Isso indica o conjunto de caracteres da tabela. Ele não informa o conjunto de caracteres das tabelas criadas no futuro quando nenhum conjunto de caracteres é especificado na sintaxe criar tabela (você precisará do conjunto de caracteres do esquema para isso).
HoldOffHunger
217

Para bancos de dados :

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

Cf. nesta página . E confira o manual do MySQL

J. Polfer
fonte
3
Isso responde apenas a 1/3 da pergunta.
Tobias J
1
@TobyJ, eu não vê-lo reclamando a stackoverflow.com/a/4805510/632951
Pacerier
o que cf significa? O link ainda não existe. @Pacerier
Yannis Dran
Isso deve ser mesclado na resposta superior. Isso realmente me ajudou.
precisa saber é
150

Para todos os bancos de dados que você possui no servidor:

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

Resultado:

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

Para um único banco de dados :

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

Resultado:

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

Obtendo o agrupamento para Tabelas :

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

OU - produzirá o SQL completo para criar a tabela:

mysql> show create table my_tablename


Obtendo o agrupamento de colunas :

mysql> SHOW FULL COLUMNS FROM my_tablename;

resultado:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....
Nabeel Ahmed
fonte
Qual versão do mysql mostra essa saída type? Eu tenho o mysql 5.7.9 e typemostro o data typeda coluna e não o character set. Alguns gostam int(10) varchar(255)... etc e nãoutf8
MTK
Minha saída mostra typecomo data typetambém o @MTK, talvez acima seja um erro de copiar e colar na seção "output:".
Tronmcp 02/02/19
65

Para tabelas :

SHOW TABLE STATUS listará todas as tabelas.

Filtrar usando:

SHOW TABLE STATUS where name like 'table_123';
Vex
fonte
9
Observe. O agrupamento mostrado no status da tabela de show não é o conjunto de caracteres da tabela. O agrupamento informa como os caracteres são classificados / comparados. por exemplo, utf8_bin_ci compara dados sem considerar o caso (sem distinção entre maiúsculas e minúsculas, portanto "m" e "M" são iguais)), utf8_bin_cs compara com a distinção entre maiúsculas e minúsculas (portanto, "m" e "M" são distintos). Não é o mesmo que o conjunto de caracteres de uma tabela.
Daan
6
@ Daan, Pare de espalhar informações erradas. Consulte stackoverflow.com/questions/1049728/… , com o agrupamento que você pode dizer ao conjunto de caracteres.
Pacerier 20/08/2015
44

Para bancos de dados :

Basta usar estes comandos:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;
DC-
fonte
34
SELECT TABLE_SCHEMA,
       NOME DA TABELA,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       NOME DA COLUNA,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  FROM information_schema.TABLES AS T
  JUNTE-SE ao information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
  JUNTE-se a information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
       ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 WHERE TABLE_SCHEMA = SCHEMA ()
   AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
 PEDIDO POR TABLE_SCHEMA,
          NOME DA TABELA,
          NOME DA COLUNA
;
Eric
fonte
2
Muito bom, Eric. Basta colar esse código na linha de comando mysql, bateu retorno e você obter o conjunto de caracteres de cada coluna em cada tabela em cada banco de dados :)
Jerry Krinock
1
@JerryKrinock Você obtém todas as colunas do banco de dados atual e nada se nenhum banco de dados estiver selecionado.
Ortomala Lokni
24

Eu sempre olho SHOW CREATE TABLE mydatabase.mytable.

Para o banco de dados, parece que você precisa olhar SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA.

caos
fonte
3
no MySQL bancos de dados pode ter conjuntos de caracteres padrão
James
3
select default_character_set_name from information_schema.schematanão é suficiente porque você não pode dizer qual linha se correlaciona com qual banco de dados. Use select default_character_set_name,schema_name from information_schema.schemataou simplesmente: select*from information_schema.schemata.
Pacerier 20/08/2015
Eu usei SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G; e funcionou muito bem :) Obrigado!
Sankalp
23

Para ver o agrupamento padrão do banco de dados:

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

Para ver o agrupamento da tabela:

SHOW TABLE STATUS where name like 'table_name';

Para ver o agrupamento das colunas:

SHOW FULL COLUMNS FROM table_name;
user1012513
fonte
21

Para tabelas e colunas :

show create table your_table_name
James
fonte
2
Ele informa o SQL completo que seria usado para criar a tabela como está atualmente, o que deve incluir seu conjunto de caracteres.
James
Além disso, se a coluna não indicar um conjunto de caracteres específico, ela estará usando o conjunto de caracteres padrão da tabela.
Pacerier 20/08/2015
18

Para bancos de dados :

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

Exemplo de saída:

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
fonte
Esta não é uma repetição da primeira resposta na parte superior e stackoverflow.com/a/1049753/632951 ?
Pacerier 20/08/2015
1
@Pacerier, você realmente comparou minha resposta a essas corretamente?
Ssp 01/09
15

Para bancos de dados :

SHOW CREATE DATABASE "DB_NAME_HERE";

Ao criar um banco de dados (MySQL), o conjunto de caracteres / agrupamento padrão é sempre LATIN, em vez de você selecionar um diferente ao criar inicialmente seu banco de dados

amenko
fonte
3
A citação necessária para "conjunto / agrupamento de caracteres padrão é sempre LATIN" no MySQL.
Pacerier 20/08/2015
Citação necessária? Você já usou um banco de dados MySQL? Todo mundo sabe que o conjunto de caracteres / agrupamento padrão é latin1_swedish_ciporque Monty Widenius, o criador do MySQL, é sueco e não estava pensando tão bem como deveria quando começou.
Spencer Williams
5

Como muitos escreveram anteriormente, SHOW FULL COLUMNS deve ser o método preferido para obter informações da coluna. O que falta é uma maneira de obter o conjunto de caracteres depois disso, sem acessar diretamente as tabelas de metadados:

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