Wie sehe ich, welcher Zeichensatz eine MySQL-Datenbank / -Tabelle / -Spalte ist?

Antworten:

742

So würde ich es machen -

Für Schemas (oder Datenbanken - sie sind Synonyme):

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

Für Tabellen:

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

Für Spalten:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";
Zenshai
quelle
3
Zu beachten ist, dass information_schema meiner Meinung nach nur in MySQL 5 verfügbar ist.
Vex
4
Soweit ich sagen kann, können Sie dem Abrufen spaltenspezifischer Zeichensatzinformationen in MySQL <5
Robin Winslow
14
Diese Antwort war sehr hilfreich, aber wenn Sie ein Problem mit dem Zeichensatz / der Sortierung beheben möchten, müssen Sie wahrscheinlich auch die Verbindung Zeichensatz, Client-Zeichensatz usw. überprüfen: VARIABLEN WIE 'Zeichensatz%' ANZEIGEN; SHOW VARIABLES LIKE 'collation%';
BenL
2
Die Tabellenoperation gibt für mich "Leere Menge (0,00 Sek.)" zurück
minhajul
9
Für Schema-Dummies: Beachten Sie, dass dies schemanamemöglicherweise nur der Datenbankname ist.
BurninLeo
465

Für Spalten :

SHOW FULL COLUMNS FROM table_name;
serhat
quelle
43
Hallo, das ist die Zukunft! Für alle, die diese Antwort überprüfen, zeigt diese Methode nur die Sortierung und nicht den Zeichensatz. Ich glaube, dass sich dies bei MySQL 5 geändert hat (siehe Antwort mit mehr Punkten für eine bessere Methode).
Fideloper
20
@fideloper, Mit der Sortierung können Sie den Zeichensatz erkennen. Dies liegt daran, dass der erste Teil der Sortierung den Zeichensatz enthält. Wenn es sich beispielsweise um eine Kollatierung handelt latin1_swedish_ci, kann der Zeichensatz nichts anderes sein latin1. Wenn die Sortierung lautet utf8mb4_general_ci, kann der Zeichensatz nichts anderes sein utf8mb4.
Pacerier
1
Hier erfahren Sie den Tabellenzeichensatz. Es zeigt Ihnen nicht den Zeichensatz von Tabellen an, die in Zukunft erstellt wurden, wenn in der Syntax zum Erstellen von Tabellen kein Zeichensatz angegeben ist (dafür benötigen Sie den Schemazeichensatz).
HoldOffHunger
217

Für Datenbanken :

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

Vgl. diese Seite . Und lesen Sie das MySQL-Handbuch

J. Polfer
quelle
3
Dies beantwortet nur 1/3 der Frage.
Tobias J
1
@TobyJ, ich sehe Sie nicht bei stackoverflow.com/a/4805510/632951
Pacerier
Wofür steht cf? Link existiert jedoch nicht. @ Pacerier
Yannis Dran
Dies sollte in der oberen Antwort zusammengeführt werden. Es hat mir wirklich geholfen.
beppe9000
150

Für alle Datenbanken, die Sie auf dem Server haben:

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

Ausgabe:

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

Für eine einzelne Datenbank :

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

Ausgabe:

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

Abrufen der Sortierung für Tabellen :

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

ODER - gibt das vollständige SQL für die Erstellungstabelle aus:

mysql> show create table my_tablename


Erhält die Sortierung von Spalten :

mysql> SHOW FULL COLUMNS FROM my_tablename;

Ausgabe:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....
Nabeel Ahmed
quelle
Für welche MySQL-Version wird diese Ausgabe angezeigt type? Ich habe MySQL 5.7.9 und typezeige das data typeder Spalte nicht das character set. Einige mögen int(10) varchar(255)... etc und nichtutf8
MTK
Meine Ausgabe zeigt typeauch das data type@MTK, vielleicht ist oben ein Fehler beim Kopieren und Einfügen im Abschnitt "Ausgabe:".
Tronmcp
65

Für Tabellen :

SHOW TABLE STATUS listet alle Tabellen auf.

Filtern mit:

SHOW TABLE STATUS where name like 'table_123';
Ärgern
quelle
9
Bitte beachten Sie. Die im Status show show angezeigte Sortierung ist nicht der Zeichensatz der Tabelle. Die Sortierung zeigt Ihnen, wie die Zeichen sortiert / verglichen werden. Beispiel: utf8_bin_ci vergleicht Daten ohne Berücksichtigung des Falls (Groß- und Kleinschreibung wird nicht berücksichtigt, daher sind "m" und "M" gleich). Utf8_bin_cs vergleicht die Groß- und Kleinschreibung (also unterscheiden sich "m" und "M"). Dies ist nicht dasselbe wie der Zeichensatz einer Tabelle.
Daan
6
@Daan, hör auf, Fehlinformationen zu verbreiten. Siehe stackoverflow.com/questions/1049728/… . Die Sortierung können Sie dem Zeichensatz mitteilen.
Pacerier
44

Für Datenbanken :

Verwenden Sie einfach diese Befehle:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;
DC-
quelle
34
SELECT TABLE_SCHEMA,
       TABELLENNAME,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       SPALTENNAME,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  FROM information_schema.TABLES AS T.
  JOIN information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
  JOIN 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')
 ORDER BY TABLE_SCHEMA,
          TABELLENNAME,
          SPALTENNAME
;;
Eric
quelle
2
Sehr schön, Eric. Fügen Sie diesen Code einfach in die MySQL-Befehlszeile ein,
drücken Sie die Eingabetaste
1
@JerryKrinock Sie erhalten alle Spalten der aktuellen Datenbank und nichts, wenn keine Datenbank ausgewählt ist.
Ortomala Lokni
24

Ich schaue immer nur an SHOW CREATE TABLE mydatabase.mytable.

Für die Datenbank scheint es, dass Sie sich ansehen müssen SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA.

Chaos
quelle
3
in MySQL-Datenbanken können Standardzeichensätze haben
James
3
select default_character_set_name from information_schema.schemataist nicht genug, weil Sie nicht sagen können, welche Zeile mit welcher Datenbank korreliert. Verwenden Sie select default_character_set_name,schema_name from information_schema.schemataoder einfach : select*from information_schema.schemata.
Pacerier
Ich habe verwendet SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G; und es hat super funktioniert :) Danke!
Sankalp
23

So zeigen Sie die Standardkollatierung der Datenbank an:

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

So zeigen Sie die Zusammenstellung der Tabelle an:

SHOW TABLE STATUS where name like 'table_name';

So zeigen Sie die Sortierung der Spalten an:

SHOW FULL COLUMNS FROM table_name;
user1012513
quelle
21

Für Tabellen und Spalten :

show create table your_table_name
James
quelle
2
Es zeigt Ihnen die vollständige SQL an, die zum Erstellen der aktuellen Tabelle verwendet werden würde, einschließlich des Zeichensatzes.
James
Wenn in der Spalte kein bestimmter Zeichensatz angegeben ist, wird der Standardzeichensatz der Tabelle verwendet.
Pacerier
18

Für Datenbanken :

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

Beispielausgabe:

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
quelle
Ist dies nicht eine Wiederholung der ersten Antwort oben und stackoverflow.com/a/1049753/632951 ?
Pacerier
1
@ Pacerier hast du meine Antwort tatsächlich richtig mit diesen verglichen?
Sjas
15

Für Datenbanken :

SHOW CREATE DATABASE "DB_NAME_HERE";

Beim Erstellen einer Datenbank (MySQL) ist der Standardzeichensatz / die Standardkollatierung immer LATIN, stattdessen haben Sie beim erstmaligen Erstellen Ihrer Datenbank einen anderen ausgewählt

Amenko
quelle
3
Das in MySQL für "Standardzeichensatz / Kollatierung ist immer LATIN" erforderliche Zitat .
Pacerier
Zitat benötigt? Haben Sie jemals eine MySQL-Datenbank verwendet? Jeder weiß, dass der Standardzeichensatz / die Standardkollatierung darin besteht, latin1_swedish_cidass Monty Widenius, der Schöpfer von MySQL, schwedisch ist und nicht so groß gedacht hat, wie er es zu Beginn haben sollte.
Spencer Williams
5

Wie viele zuvor geschrieben haben, sollte SHOW FULL COLUMNS die bevorzugte Methode sein, um Spalteninformationen abzurufen. Was fehlt, ist eine Möglichkeit, einen Zeichensatz danach abzurufen, ohne die Metadatentabellen direkt zu erreichen:

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