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

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;

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


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  |
+---------+--------------+--------------------+ ....

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

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;

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

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.


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;

21

Für Tabellen und Spalten :

show create table your_table_name

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> 

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


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'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.