Как мне узнать, что такое набор символов базы данных / таблицы / столбца MySQL?

Ответы:

745

Вот как бы я это сделал -

Для схем (или баз данных - это синонимы):

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

Для таблиц:

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

Для столбцов:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";
Zenshai
источник
3
Должен отметить, что information_schema только в MySQL 5 и далее, я считаю.
Vex
4
Насколько я могу судить, самое близкое к тому, что вы можете получить для получения информации о наборе символов, специфичных для столбцов в MySQL <5, - ​​это выполнить ПОКАЗАТЬ ПОЛНЫЕ КОЛОННЫ ИЗ tableName
Робин Уинслоу
14
Этот ответ был очень полезен, но если вы хотите решить проблему с набором символов / сопоставлением, вам, возможно, также понадобится проверить соединение набор символов: символ_символа и т. Д. ...: SHOW VARIABLES LIKE 'character_set%'; ПОКАЗАТЬ ПЕРЕМЕННЫЕ НРАВИТСЯ 'collation%';
BenL
2
табличная операция возвращает мне «пустой набор (0,00 сек)»
minhajul
9
Для схем-манекенов: обратите внимание, это schemanameможет быть просто имя базы данных.
BurninLeo
465

Для столбцов :

SHOW FULL COLUMNS FROM table_name;
Serhat
источник
43
Здравствуйте, это будущее говорит! Для тех, кто проверяет этот ответ, этот метод показывает только сопоставление, а не набор символов. Я считаю, что это изменилось в MySQL 5. (См. Ответ с большим количеством пунктов для лучшего метода).
Фиделопер
20
@fideloper, с помощью сопоставления вы можете сказать кодировку. Это потому, что первая часть сопоставления включает в себя набор символов, например, если это сопоставление latin1_swedish_ci, набор символов не может быть ничем иным, кроме latin1. Если сопоставление есть utf8mb4_general_ci, кодировка не может быть ничем иным, кроме utf8mb4.
Pacerier
1
Это говорит вам о наборе символов таблицы. Он не сообщает вам набор символов таблиц, созданных в будущем, когда в синтаксисе создания таблицы не указан набор символов (для этого вам понадобится набор символов схемы).
HoldOffHunger
217

Для баз данных :

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

Ср эта страница . И проверить руководство MySQL

Дж. Полфер
источник
3
Это только ответит на 1/3 вопроса.
Тобиас Дж
1
@TobyJ, я не вижу, чтобы ты жаловался на stackoverflow.com/a/4805510/632951
Pacerier
что означает cf? Ссылка не существует, хотя. @Pacerier
Яннис Дран
Это должно быть объединено в верхнем ответе. Это действительно помогло мне.
beppe9000
150

Для всех баз данных на сервере:

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    |
| my_database                | latin1  | latin1_swedish_ci  |
...
+----------------------------+---------+--------------------+

Для одной базы данных :

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

Вывод:

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

Получение сопоставления для таблиц :

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

ИЛИ - выведет полный SQL для создания таблицы:

mysql> show create table my_tablename


Получение сопоставления столбцов :

mysql> SHOW FULL COLUMNS FROM my_tablename;

вывод:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....
Набиль Ахмед
источник
Для какой версии mysql показывать этот вывод type? У меня есть mysql 5.7.9, и я typeпоказываю data typeстолбец, а не character set. Некоторым нравится int(10) varchar(255)... и т. Д. И нетutf8
MTK
Мой вывод показывает , typeкак data typeа @MTK, возможно , выше , является ошибкой копировать вставить в «выход:» раздел.
tronmcp
65

Для таблиц :

SHOW TABLE STATUS перечислит все таблицы.

Фильтр с использованием:

SHOW TABLE STATUS where name like 'table_123';
сердить
источник
9
Пожалуйста, обратите внимание. Параметры сортировки, отображаемые в состоянии отображения таблицы, не являются набором символов таблицы. Сопоставление говорит вам, как символы сортируются / сравниваются. Например, utf8_bin_ci сравнивает данные без учета регистра (без учета регистра, поэтому «m» и «M» одинаковы), utf8_bin_cs сравнивает с учетом регистра (поэтому «m» и «M» различны). Это не то же самое, что набор символов таблицы.
Даан
6
@ Даан, Хватит распространять дезинформацию. См. Stackoverflow.com/questions/1049728/… , с сопоставлением, которое вы можете сообщить кодировке.
Pacerier
44

Для баз данных :

Просто используйте эти команды:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;
ОКРУГ КОЛУМБИЯ-
источник
34
ВЫБЕРИТЕ TABLE_SCHEMA,
       TABLE_NAME,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  FROM information_schema.TABLES AS T
  ПРИСОЕДИНЯЙТЕСЬ к information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
  ПРИСОЕДИНИТЕСЬ к information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
       ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 ГДЕ TABLE_SCHEMA = SCHEMA ()
   AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
 ORDER BY TABLE_SCHEMA,
          TABLE_NAME,
          COLUMN_NAME
;
Эрик
источник
2
Очень мило, Эрик. Просто вставьте этот код в командную строку mysql, нажмите return, и вы получите набор символов для каждого столбца в каждой таблице в каждой базе данных :)
Джерри Кринок
1
@JerryKrinock Вы получаете все столбцы текущей базы данных и ничего, если база данных не выбрана.
Ортомала Локни
24

Я всегда просто смотрю на SHOW CREATE TABLE mydatabase.mytable.

Для базы данных, кажется, вам нужно посмотреть SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA.

хаос
источник
3
в базах данных mysql могут быть наборы символов по умолчанию
James
3
select default_character_set_name from information_schema.schemataнедостаточно, потому что вы не можете сказать, какая строка соотносится с какой базой данных. Используйте select default_character_set_name,schema_name from information_schema.schemataили просто: select*from information_schema.schemata.
Pacerier
Я использовал SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G; И это работало отлично :) Спасибо!
Санкальп
23

Чтобы увидеть параметры сортировки базы данных по умолчанию:

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

Чтобы увидеть сопоставление таблицы:

SHOW TABLE STATUS where name like 'table_name';

Чтобы увидеть сортировку столбцов:

SHOW FULL COLUMNS FROM table_name;
user1012513
источник
21

Для таблиц и столбцов :

show create table your_table_name
Джеймс
источник
2
Он сообщает вам полный SQL-код, который будет использоваться для создания таблицы в том виде, в котором она в данный момент находится, которая должна включать ее набор символов.
Джеймс
Кроме того, если в столбце не указан конкретный набор символов, он использует набор символов по умолчанию для таблицы.
Pacerier
18

Для баз данных :

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

Пример вывода:

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
источник
Разве это не повторение первого ответа сверху и stackoverflow.com/a/1049753/632951 ?
Pacerier
1
@Pacerier ты правильно сравнил мой ответ с этим?
sjas
15

Для баз данных :

SHOW CREATE DATABASE "DB_NAME_HERE";

При создании базы данных (MySQL) набор символов / сопоставление по умолчанию всегда LATIN, вместо этого вы выбрали другой при первоначальном создании базы данных.

amenko
источник
3
Цитата, необходимая для "набора символов / сопоставления по умолчанию, всегда LATIN" в MySQL.
Pacerier
Нужна цитата? Вы когда-нибудь использовали базу данных MySQL? Всем известно, что набор символов / сопоставление по умолчанию объясняется latin1_swedish_ciтем, что Монти Видениус, создатель MySQL, является шведским и не думал о себе как о большой картине, как следовало бы, когда он начинал.
Спенсер Уильямс
5

Как многие писали ранее, SHOW FULL COLUMNS должен быть предпочтительным методом для получения информации о столбцах. Чего не хватает, так это способа получить кодировку без непосредственного доступа к таблицам метаданных

SHOW FULL COLUMNS FROM my_table WHERE Field = 'my_field'
SHOW COLLATION WHERE Collation = 'collation_you_got'
WowPress.host
источник