Karaktersets & collation (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
(2 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 92: Regel 92:
 
|[[file:20190612-1053.png|thumb|Ongewoon UTF8?]]
 
|[[file:20190612-1053.png|thumb|Ongewoon UTF8?]]
 
|}
 
|}
 +
 +
Een paar ideeën:
 +
 +
* De toevoeging betreft ''collation'', dus hoe dingen worden gesorteerd. Dat kan van land tot land verschillen, oa. omdat ''[https://nl.wikipedia.org/wiki/Digraaf digrafen]'' soms afwijkend gesorteerd worden
 +
* Standaard-keuze: ''utf8_general_ci'' - Omdat er geen specifieke Engelse variant is.
  
 
== Zie ook ==
 
== Zie ook ==

Versie van 12 jun 2019 11:17

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. Drupal gebruikt dit ook - utf8 - default collation om precies te zijn
  • 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 database uitlezen

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

Wellicht eenvoudiger:

show variables like "character_set_database";

Codering 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 kolommen uitlezen

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

Bv.:

SELECT collation_name FROM information_schema.COLUMNS 
where table_schema="webwinkels" and TABLE_NAME="superquery_export";

Kolom-codering aanpassen

Je kunt niet zomaar schrijven naar information_schema, maar dat hoeft ook niet:

ALTER TABLE mytable CONVERT TO CHARACTER SET latin1

Welke UTF8-variant?

Dit zijn de UTF-varianten die MySQL aanbiedt bij aanmaak van een nieuwe database in MySQL Workbench:

Gewoon UTF8?
Ongewoon UTF8?

Een paar ideeën:

  • De toevoeging betreft collation, dus hoe dingen worden gesorteerd. Dat kan van land tot land verschillen, oa. omdat digrafen soms afwijkend gesorteerd worden
  • Standaard-keuze: utf8_general_ci - Omdat er geen specifieke Engelse variant is.

Zie ook

Bronnen