Risposte:
Ecco come lo farei -
Per schemi (o database - sono sinonimi):
SELECT default_character_set_name FROM information_schema.SCHEMATA
WHERE schema_name = "schemaname";
Per i tavoli:
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";
Per le colonne:
SELECT character_set_name FROM information_schema.`COLUMNS`
WHERE table_schema = "schemaname"
AND table_name = "tablename"
AND column_name = "columnname";
schemaname
potrebbe essere solo il nome del database.
Per colonne :
SHOW FULL COLUMNS FROM table_name;
latin1_swedish_ci
, il set di caratteri non può essere altro latin1
. Se il confronto è utf8mb4_general_ci
, il set di caratteri non può essere altro utf8mb4
.
Per i database :
USE your_database_name;
show variables like "character_set_database";
-- or:
-- show variables like "collation_database";
Cf. questa pagina . E controlla il manuale di MySQL
Per tutti i database che hai sul server:
mysql> SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;
Produzione:
+----------------------------+---------+--------------------+
| database | charset | collation |
+----------------------------+---------+--------------------+
| information_schema | utf8 | utf8_general_ci |
| my_database | latin1 | latin1_swedish_ci |
...
+----------------------------+---------+--------------------+
Per un singolo database :
mysql> USE my_database;
mysql> show variables like "character_set_database";
Produzione:
+----------------------------+---------+
| Variable_name | Value |
+----------------------------+---------+
| character_set_database | latin1 |
+----------------------------+---------+
Ottenere le regole di confronto per le tabelle :
mysql> USE my_database;
mysql> SHOW TABLE STATUS WHERE NAME LIKE 'my_tablename';
OPPURE - genererà l'SQL completo per la creazione della tabella:
mysql> show create table my_tablename
Ottenere le regole di confronto delle colonne :
mysql> SHOW FULL COLUMNS FROM my_tablename;
produzione:
+---------+--------------+--------------------+ ....
| field | type | collation |
+---------+--------------+--------------------+ ....
| id | int(10) | (NULL) |
| key | varchar(255) | latin1_swedish_ci |
| value | varchar(255) | latin1_swedish_ci |
+---------+--------------+--------------------+ ....
type
? Ho mysql 5.7.9 e type
mostra data type
la colonna non la character set
. Alcuni come int(10)
varchar(255)
... ecc. E nonutf8
type
come data type
pure @MTK, forse soprattutto è un errore di copia incolla nel "uscita:" la sezione.
Per i tavoli :
SHOW TABLE STATUS
elencherà tutte le tabelle.
Filtra usando:
SHOW TABLE STATUS where name like 'table_123';
SELEZIONA TABLE_SCHEMA, TABLE_NAME, CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET, COLUMN_NAME, tipo_colonna, C.CHARACTER_SET_NAME DA information_schema.TABLES COME T UNISCITI information_schema.COLUMNS COME C USING (TABLE_SCHEMA, TABLE_NAME) UNISCITI information_schema.COLLATION_CHARACTER_SET_APPLICABILITY COME CCSA ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME) DOVE TABLE_SCHEMA = SCHEMA () AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext') ORDINA PER TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME ;
Lo guardo sempre e basta SHOW CREATE TABLE mydatabase.mytable
.
Per il database, sembra che tu debba guardare SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA
.
select default_character_set_name from information_schema.schemata
non è sufficiente perché non è possibile stabilire quale riga sia correlata a quale database. Utilizzare select default_character_set_name,schema_name from information_schema.schemata
o semplicemente: select*from information_schema.schemata
.
SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G;
E ha funzionato benissimo :) Grazie!
Per visualizzare le regole di confronto predefinite del database:
USE db_name;
SELECT @@character_set_database, @@collation_database;
Per visualizzare le regole di confronto della tabella:
SHOW TABLE STATUS where name like 'table_name';
Per visualizzare le regole di confronto delle colonne:
SHOW FULL COLUMNS FROM table_name;
Per tabelle e colonne :
show create table your_table_name
Per i database :
SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;
Esempio di output:
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>
Per i database :
SHOW CREATE DATABASE "DB_NAME_HERE";
Nella creazione di un database (MySQL), il set di caratteri / regole di confronto predefiniti è sempre LATINO, invece di averne selezionato uno diverso nella creazione iniziale del database
latin1_swedish_ci
perché Monty Widenius, il creatore di MySQL, è svedese e non pensava al grande quadro come avrebbe dovuto iniziare.
Come molti hanno scritto in precedenza, SHOW FULL COLUMNS dovrebbe essere il metodo preferito per ottenere informazioni sulla colonna. Ciò che manca è un modo per ottenere il set di caratteri dopo quello senza raggiungere direttamente le tabelle dei metadati:
SHOW FULL COLUMNS FROM my_table WHERE Field = 'my_field'
SHOW COLLATION WHERE Collation = 'collation_you_got'
SHOW CREATE TABLE
, come discusso in stackoverflow.com/questions/57628217/…