Jak sprawdzić, jaki zestaw znaków znajduje się w bazie danych / tabeli / kolumnie MySQL?

Odpowiedzi:

743

Oto jak bym to zrobił -

W przypadku schematów (lub baz danych - są to synonimy):

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

Dla tabel:

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

Dla kolumn:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";
Zenshai
źródło
3
Należy zauważyć, że informacja_schema jest dostępna tylko w MySQL 5.
Vex
4
O ile mogę powiedzieć, że najbliższe pobieranie informacji o zestawie znaków w kolumnie MySQL <5 polega na POKAŻ PEŁNE KOLUMNY z tableName
Robin Winslow,
14
Ta odpowiedź była bardzo pomocna, ale jeśli chcesz rozwiązać problem z zestawem znaków / zestawieniem, prawdopodobnie będziesz musiał również sprawdzić połączenie zestaw znaków, zestaw znaków klienta itp ...: POKAŻ ZMIENNE PODOBNE „zestaw znaków”; POKAŻ ZMIENNE JAK „collation%”;
BenL
2
operacja na tabeli zwraca dla mnie „Pusty zestaw (0,00 s)”
minhajul
9
Dla Schema-Dummies: Uwaga, schemanamemoże to być tylko nazwa bazy danych.
BurninLeo,
465

Dla kolumn :

SHOW FULL COLUMNS FROM table_name;
serhat
źródło
43
Witaj, to mówi w przyszłości! Dla każdego, kto sprawdza tę odpowiedź, ta metoda pokazuje tylko sortowanie, a nie zestaw znaków. Wierzę, że zmieniło się to w MySQL 5. (Zobacz odpowiedź z większą liczbą punktów, aby uzyskać lepszą metodę).
fideloper
20
@fideloper, Za pomocą sortowania możesz rozpoznać zestaw znaków. Jest tak, ponieważ pierwsza część zestawiania zawiera zestaw znaków, np. Jeśli zestawienie jest latin1_swedish_ci, zestaw znaków nie może być niczym innym niż latin1. Jeśli zestawienie jest utf8mb4_general_ci, zestaw znaków nie może być niczym innym niż utf8mb4.
Pacerier,
1
To powie ci zestaw znaków tabeli. Nie informuje o zestawie znaków tabel utworzonych w przyszłości, gdy w składni tworzenia tabeli nie podano żadnego zestawu znaków (do tego potrzebny będzie zestaw znaków schematu).
HoldOffHunger
217

W przypadku baz danych :

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

Por. ta strona . I sprawdź instrukcję MySQL

J. Polfer
źródło
3
To tylko odpowiada 1/3 pytania.
Tobias J
1
@TobyJ, nie widzę, jak narzekasz na stackoverflow.com/a/4805510/632951
Pacerier,
co oznacza cf? link nie istnieje. @Pacerier
Yannis Dran
To powinno być połączone w górnej odpowiedzi. To naprawdę mi pomogło.
beppe9000,
150

Dla wszystkich baz danych, które masz na serwerze:

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

Wynik:

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

W przypadku pojedynczej bazy danych :

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

Wynik:

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

Uzyskiwanie zestawień dla tabel :

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

LUB - wyświetli pełny kod SQL do utworzenia tabeli:

mysql> show create table my_tablename


Pobieranie zestawienia kolumn :

mysql> SHOW FULL COLUMNS FROM my_tablename;

wynik:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....
Nabeel Ahmed
źródło
Dla jakiej wersji mysql wyświetla to wyjście type? Mam mysql 5.7.9 i typepokazuję data typekolumnę, a nie character set. Niektórzy lubią int(10) varchar(255)... itd. I nieutf8
MTK
Moje wyjście pokazuje typejak data typeoraz @MTK, być może powyżej jest błąd pasty kopia w „wyjściu” sekcji.
tronmcp
65

Dla tabel :

SHOW TABLE STATUS wyświetli wszystkie tabele.

Filtruj za pomocą:

SHOW TABLE STATUS where name like 'table_123';
Drażnić
źródło
9
Proszę zanotować. Zestawienie pokazane w stanie tabeli pokazu nie jest zestawem znaków tabeli. Zestawienie informuje, w jaki sposób postacie są sortowane / porównywane. np. utf8_bin_ci porównuje dane bez względu na wielkość liter (bez rozróżniania wielkości liter, więc „m” i „M” są takie same), utf8_bin_cs porównuje z rozróżnianiem wielkości liter (więc „m” i „M” są różne). To nie to samo, co zestaw znaków w tabeli.
Daan
6
@Dan, przestań rozpowszechniać dezinformacje. Zobacz stackoverflow.com/questions/1049728/... , z zestawieniem, które możesz rozpoznać w zestawie znaków.
Pacerier,
44

Do baz danych :

Wystarczy użyć tych poleceń:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;
DC-
źródło
34
SELECT TABLE_SCHEMA,
       NAZWA TABELI,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       NAZWA KOLUMNY,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  Z Information_schema.TABLES AS T
  DOŁĄCZ do schematu_informacyjnego.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
  DOŁĄCZ do schematu informacyjnego.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
       ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 GDZIE TABELA_SCHEMA = SCHEMA ()
   ORAZ C.DATA_TYPE IN („enum”, „varchar”, „char”, „text”, „mediumtext”, „longtext”)
 ZAMÓW WEDŁUG TABELI_SCHEMA,
          NAZWA TABELI,
          NAZWA KOLUMNY
;
Eric
źródło
2
Bardzo miło, Eric. Wystarczy wkleić ten kod do wiersza polecenia mysql, nacisnąć
klawisz
1
@JerryKrinock Otrzymasz wszystkie kolumny bieżącej bazy danych i nic, jeśli nie zostanie wybrana żadna baza danych.
Ortomala Lokni
24

Zawsze tylko patrzę SHOW CREATE TABLE mydatabase.mytable.

W przypadku bazy danych wydaje się, że musisz na nią spojrzeć SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA.

chaos
źródło
3
w bazach mysql mogą mieć domyślne zestawy znaków
James
3
select default_character_set_name from information_schema.schematato za mało, ponieważ nie można powiedzieć, który wiersz koreluje z bazą danych. Użyj select default_character_set_name,schema_name from information_schema.schematalub po prostu: select*from information_schema.schemata.
Pacerier,
Użyłem SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G; I działało świetnie :) Dzięki!
Sankalp,
23

Aby zobaczyć domyślne sortowanie bazy danych:

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

Aby zobaczyć zestawienie tabeli:

SHOW TABLE STATUS where name like 'table_name';

Aby zobaczyć zestawienie kolumn:

SHOW FULL COLUMNS FROM table_name;
użytkownik1012513
źródło
21

W przypadku tabel i kolumn :

show create table your_table_name
James
źródło
2
Mówi ci pełny SQL, który zostałby użyty do utworzenia tabeli w jej obecnej postaci, która powinna zawierać zestaw znaków.
James
Ponadto, jeśli kolumna nie zawiera określonego zestawu znaków, oznacza to, że używa domyślnego zestawu znaków tabeli.
Pacerier,
18

W przypadku baz danych :

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

Przykładowe dane wyjściowe:

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
źródło
Czy to nie jest powtórzenie pierwszej odpowiedzi na górze i stackoverflow.com/a/1049753/632951 ?
Pacerier,
1
@Pacerier, czy faktycznie właściwie porównałeś moją odpowiedź?
sjas
15

W przypadku baz danych :

SHOW CREATE DATABASE "DB_NAME_HERE";

Podczas tworzenia bazy danych (MySQL) domyślnym zestawem znaków / zestawieniem jest zawsze LATIN, zamiast tego wybrano inny na początku tworzenia bazy danych

Amenko
źródło
3
Cytowanie potrzebne do „domyślnego zestawu znaków / sortowania jest zawsze LATIN” w MySQL.
Pacerier,
Wymagany cytat? Czy kiedykolwiek korzystałeś z bazy danych MySQL? Wszyscy wiedzą, że domyślny zestaw / zestaw znaków wynika z tego, latin1_swedish_ciże Monty Widenius, twórca MySQL, jest Szwedem i nie myślał tak dużego obrazu, jak powinien, kiedy zaczynał.
Spencer Williams
5

Jak wielu pisało wcześniej, SHOW FULL COLUMNS powinna być preferowaną metodą uzyskiwania informacji o kolumnach. Brakuje sposobu na uzyskanie zestawu znaków bez bezpośredniego sięgania do tabel metadanych:

SHOW FULL COLUMNS FROM my_table WHERE Field = 'my_field'
SHOW COLLATION WHERE Collation = 'collation_you_got'
WowPress.host
źródło