ฉันจะดูได้อย่างไรว่าตัวละครชุดฐานข้อมูล MySQL / ตาราง / คอลัมน์คืออะไร?


652

ชุดอักขระ (ค่าเริ่มต้น) คืออะไร:

  • ฐานข้อมูล MySQL

  • ตาราง MySQL

  • คอลัมน์ MySQL


1
สำหรับตารางและคอลัมน์เพียงใช้SHOW CREATE TABLEตามที่กล่าวไว้ในstackoverflow.com/questions/57628217/…
Rick James

คำตอบ:


743

นี่คือวิธีที่ฉันทำ -

สำหรับ Schemas (หรือฐานข้อมูล - เป็นคำพ้องความหมาย):

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

3
ควรสังเกตว่า information_schema นั้นมีเฉพาะใน MySQL 5 เป็นต้นไปฉันเชื่อว่า
Vex

4
เท่าที่ฉันสามารถบอกได้ใกล้เคียงที่สุดคุณจะได้รับข้อมูลคอลัมน์ชุดอักขระเฉพาะใน MySQL <5 คือการแสดง SHOW FULL COLUMNS จาก tableName
Robin Winslow

14
คำตอบนี้มีประโยชน์มาก แต่ถ้าคุณต้องการแก้ไขปัญหา character_set / collation คุณอาจต้องตรวจสอบการเชื่อมต่อ character_set, client_character_set ฯลฯ ... : SHOW VARIABLES LIKE 'character_set%'; แสดงตัวแปรต่าง ๆ เช่น 'collation%';
BenL

2
การดำเนินการของตารางส่งกลับ "ชุดว่าง (0.00 วินาที)" สำหรับฉัน
minhajul

9
สำหรับ Schema-Dummies: หมายเหตุนั่นschemanameอาจเป็นเพียงชื่อฐานข้อมูล
BurninLeo

465

สำหรับคอลัมน์ :

SHOW FULL COLUMNS FROM table_name;

43
สวัสดีนี่คือการพูดในอนาคต! สำหรับใครก็ตามที่ตรวจสอบคำตอบนี้วิธีนี้จะแสดงเฉพาะการเรียงแทนที่จะเป็นชุดอักขระ ฉันเชื่อว่าสิ่งนี้เปลี่ยนแปลงที่ MySQL 5. (ดูคำตอบด้วยคะแนนที่มากขึ้นสำหรับวิธีที่ดีกว่า)
fideloper

20
@ ผู้พัฒนาด้วยการเปรียบเทียบคุณสามารถบอก charset นั่นเป็นเพราะในส่วนแรกของการเปรียบเทียบรวมถึง charset เช่นถ้าเปรียบเทียบเป็นlatin1_swedish_ci, charset latin1ไม่สามารถเป็นอะไรอื่นนอกเหนือจาก หากเปรียบเทียบเป็นutf8mb4_general_ci, charset utf8mb4ไม่สามารถเป็นอะไรอื่นนอกเหนือจาก
Pacerier

1
สิ่งนี้บอกชุดอักขระของตาราง ไม่ได้บอกชุดอักขระของตารางที่สร้างขึ้นในอนาคตเมื่อไม่ได้ระบุชุดอักขระในไวยากรณ์สร้างตาราง (คุณจะต้องใช้ชุดอักขระของชุดอักขระสำหรับชุดนั้น)
HoldOffHunger

217

สำหรับฐานข้อมูล :

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

cf เลย หน้านี้ และตรวจสอบคู่มือ MySQL


3
คำตอบนี้มีเพียง 1/3 ของคำถาม
โทเบียส J

1
@TobyJ ฉันไม่เห็นคุณบ่นที่ stackoverflow.com/a/4805510/632951
Pacerier

cf หมายถึงอะไร ลิงก์ไม่มีอยู่แม้ว่า @Pacerier
Yannis Dran

ควรรวมคำตอบนี้ไว้ด้วยกัน มันช่วยฉันได้จริงๆ
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" จะแตกต่างกัน) สิ่งนี้ไม่เหมือนกับชุดอักขระของตาราง
Daan

6
@Daan หยุดการแพร่กระจายข้อมูลที่ผิด ดูstackoverflow.com/questions/1049728/…ด้วยการเปรียบเทียบคุณสามารถบอก charset
Pacerier


34
เลือก TABLE_SCHEMA
       TABLE_NAME,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET
       คอลัมน์,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  จาก information_schema.TABLES เป็น T
  เข้าร่วม information_schema.COLUMNS โดยใช้ (TABLE_SCHEMA, TABLE_NAME)
  เข้าร่วม information_schema.COLLATION_CHARACTER_SET_APPLICABILITY เป็น CCSA
       เปิด (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 WHERE TABLE_SCHEMA = SCHEMA ()
   และ C.DATA_TYPE IN ('enum', 'varchar', 'char', 'ข้อความ', 'Mediumtext', 'longtext')
 เรียงตาม TABLE_SCHEMA
          TABLE_NAME,
          คอลัมน์
;

2
ดีมากเอริค เพียงแค่วางโค้ดที่เป็นบรรทัดคำสั่ง MySQL ตีผลตอบแทนและคุณได้รับชุดอักขระของทุกคอลัมน์ในทุกตารางในฐานข้อมูลทุก :)
เจอร์รี่ Krinock

1
@JerryKrinock คุณจะได้รับทุกคอลัมน์ของฐานข้อมูลปัจจุบันและไม่มีอะไรหากไม่มีการเลือกฐานข้อมูล
Ortomala Lokni

24

SHOW CREATE TABLE mydatabase.mytableฉันมักจะเพียงแค่มอง

SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATAสำหรับฐานข้อมูลก็จะปรากฏขึ้นคุณต้องมองไปที่


3
ในฐานข้อมูล MySQL สามารถมีชุดตัวอักษรเริ่มต้น
เจมส์

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; และมันใช้งานได้ดีมาก :) ขอบคุณ!
Sankalp

23

หากต้องการดูการเปรียบเทียบฐานข้อมูลเริ่มต้น:

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

หากต้องการดูการเรียงตาราง:

SHOW TABLE STATUS where name like 'table_name';

หากต้องการดูการเรียงคอลัมน์ให้ทำดังนี้

SHOW FULL COLUMNS FROM table_name;

21

สำหรับตารางและคอลัมน์ :

show create table your_table_name

2
มันบอกคุณ SQL เต็มรูปแบบที่จะใช้ในการสร้างตารางตามที่ยืนอยู่ในขณะนี้ซึ่งควรรวมถึงมันเป็นชุดอักขระ
James

นอกจากนี้หากคอลัมน์ไม่ได้ระบุชุดอักขระเฉพาะแสดงว่าใช้ชุดเริ่มต้นของตาราง
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> 

นี่ไม่ใช่คำตอบแรกซ้ำ ๆบนสุดและstackoverflow.com/a/1049753/632951หรือไม่
Pacerier

1
@Pacerier คุณเปรียบเทียบคำตอบของฉันกับสิ่งเหล่านี้ถูกต้องหรือไม่?
sjas

15

สำหรับฐานข้อมูล :

SHOW CREATE DATABASE "DB_NAME_HERE";

ในการสร้างฐานข้อมูล (MySQL) การตั้งค่า / การเรียงตัวอักขระเริ่มต้นจะเป็น LATIN เสมอแทนที่จะให้คุณเลือกชุดที่แตกต่างเพื่อเริ่มสร้างฐานข้อมูลของคุณ


3
ต้องการการอ้างอิงสำหรับ"ชุดอักขระ / การเรียงค่าเริ่มต้นคือ LATIN เสมอ"ใน MySQL
Pacerier

ต้องการการอ้างอิง? คุณเคยใช้ฐานข้อมูล MySQL หรือไม่? ทุกคนรู้ว่าชุดอักขระ / การเรียงตัวเริ่มต้นนั้นเป็นlatin1_swedish_ciเพราะ Monty Widenius ผู้สร้าง MySQL เป็นภาษาสวีเดนและไม่ได้คิดว่าเป็นภาพใหญ่เท่าที่ควรจะเป็นเมื่อเขาเริ่ม
Spencer Williams

5

ตามที่เขียนไว้ก่อนหน้านี้ SHOW FULL COLUMNS ควรเป็นวิธีที่ต้องการเพื่อรับข้อมูลคอลัมน์ สิ่งที่ขาดหายไปคือวิธีรับชุดอักขระหลังจากนั้นโดยไม่ต้องเข้าถึงตารางเมทาดาทาโดยตรง:

SHOW FULL COLUMNS FROM my_table WHERE Field = 'my_field'
SHOW COLLATION WHERE Collation = 'collation_you_got'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.