Karaktersets & collation (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 29: Regel 29:
  
 
''' Codering van tabellen uitlezen '''
 
''' Codering van tabellen uitlezen '''
 +
 +
Alle tabellen (geloof ik):
  
 
<pre>
 
<pre>
Regel 43: Regel 45:
 
   AND T.table_name = "tablename";
 
   AND T.table_name = "tablename";
 
</pre>
 
</pre>
 +
 +
Voorbeeld mbt. een specifieke tabel:
 +
 +
<pre>
 +
select table_collation from information_schema.tables
 +
where table_schema="webwinkels" and table_name="superquery_export";
 +
</pre>
 +
De waardes die ik op m'n ontwikkelmachine met zo'n 30 databases tegenkom:
 +
 +
binary
 +
latin1_swedish_ci
 +
utf_bin
 +
utf8_general_ci
 +
utf8mb4_general_ci
 +
utf8mb4_unicode_ci
  
 
''' Codering van alle kolommen uitlezen '''
 
''' Codering van alle kolommen uitlezen '''

Versie van 14 mei 2016 09:58

Amazon en Bol.com gebruiken uitsluitend ISO-8850-1 (Latin-1)-karaktersets voor importbestanden. Ik hoef dus enkel in die karakterset te exporteren.

In MySQL wordt de gebruikte karakterset op diverse plekken gespecificeerd:

  • Op database-niveau
  • Op tabelniveau
  • Per kolom.

Het is goed mogelijk om in een tabel verschillende kolommen in verschillende tekencoderingen te hebben. Sterker nog: Dat overkomt mij voortdurend.

De oplossing - Wat

  • Intern met UTF-8 werken, want open source
  • Tijdens exportprocedures wordt meestal een tabel aangemaakt zoals amazon_export. Als ik direct na aanmaken van deze tabel zorg dat-ie 100% Latin 1 is, ben ik klaar.

De oplossing - Hoe

Codering van een database uitlezen

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

Wellicht eenvoudiger:

show variables like "character_set_database";

Codering van tabellen uitlezen

Alle tabellen (geloof ik):

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

Voorbeeld mbt. een specifieke tabel:

select table_collation from information_schema.tables
where table_schema="webwinkels" and table_name="superquery_export";

De waardes die ik op m'n ontwikkelmachine met zo'n 30 databases tegenkom:

binary
latin1_swedish_ci
utf_bin
utf8_general_ci
utf8mb4_general_ci
utf8mb4_unicode_ci

Codering van alle kolommen uitlezen

SELECT character_set_name 
FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";

Zie ook

Bronnen