Data omzetten van latin1 naar utf8mb4 geeft vraagtekens
Ik heb dit script gebruikt om een MySQL-database van latin1 om te zetten naar utf8mb4
https://gist.github.com/pobegov/f8b293fb6eb658a13feb1c318e6c07ed
Het leek echt briljant, en het script wordt gewoon uitgevoerd, echter zijn alle latin1 tekens, zoals ë,á,û en € omgezet naar vraagtekens, zoals hiernaast: ?,?,? en ?. (zonder de ruitjes eromheen).
Wat gaat er mis? Het gaat bij het omzetten ergens al mis, want het staat uiteindelijk misvormd in mijn database. Dus aan de encoding van het script, evenals de PHP charset-functie in mysqli zal het niet liggen.
Uit de output die het script gaf, kwamen deze queries:
Code (php)
1
2
3
2
3
ALTER TABLE `news` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
UPDATE IGNORE `news` SET `title` = CONVERT(BINARY(CONVERT(`title` USING latin1)) USING utf8mb4), `message_short` = CONVERT(BINARY(CONVERT(`message_short` USING latin1)) USING utf8mb4), `message` = CONVERT(BINARY(CONVERT(`message` USING latin1)) USING utf8mb4), `auteur` = CONVERT(BINARY(CONVERT(`auteur` USING latin1)) USING utf8mb4), `bronurl` = CONVERT(BINARY(CONVERT(`bronurl` USING latin1)) USING utf8mb4), `bronnaam` = CONVERT(BINARY(CONVERT(`bronnaam` USING latin1)) USING utf8mb4)
UPDATE IGNORE `news` SET `title` = CONVERT(BINARY(CONVERT(`title` USING latin1)) USING utf8mb4), `message_short` = CONVERT(BINARY(CONVERT(`message_short` USING latin1)) USING utf8mb4), `message` = CONVERT(BINARY(CONVERT(`message` USING latin1)) USING utf8mb4), `auteur` = CONVERT(BINARY(CONVERT(`auteur` USING latin1)) USING utf8mb4), `bronurl` = CONVERT(BINARY(CONVERT(`bronurl` USING latin1)) USING utf8mb4), `bronnaam` = CONVERT(BINARY(CONVERT(`bronnaam` USING latin1)) USING utf8mb4)
Wat is er aan de hand?
PS: Gelukkig is dit een test, en is er geen echte data om zeep geholpen.
Gewijzigd op 17/01/2022 19:35:23 door - Ariën -
Ik kan je nu al vertellen dat ik (helaas) nooit een $mysqli->set_charset("latin1"); heb gebruikt of de vroegere variant. Mogelijk is dat dus fout gegaan bij de conversie queries uit de startpost.
Als iemand ervaring met het omzetten heeft, let me know.
Toevoeging op 18/01/2022 01:10:28:
Die simpele queries lijken wel goed te werken. Maar dan ben ik toch benieuwd waarom dat GitHub-script niet werkt, en allemaal vraagtekens neersmijt...???????
Iemand enig idee wat en hoe die precies mijn data vernachelt?
En onder welke omstandigheid had het dan wel gewerkt?
Ik ga die queries uit die tut in ieder geval even in dat conversiescript toevoegen.
Toevoeging op 18/01/2022 01:51:44:
Ook mooi leesvoer voor morgen....
http://fangorn.thijma.nl/news/latin1-vs-utf8
Thnx Thomas!
Gewijzigd op 18/01/2022 01:29:24 door - Ariën -
Ik heb er ook ervaring mee.
" Convert MySQL Database (tables and data) to UTF8MB4, where UTF8 data stored via latin1 connection "
Dus specifiek: als er unicode data is opgeslagen via een verbinding die op Latin gedefinieerd stond. Daarbij heeft de database mogelijk bepaalde conversies uitgevoerd en dit script gaat nu proberen om dit te herstellen.
Maar, is dat precies wat jij fout gedaan hebt? Of heb jij Latin aangeboden over een Latin verbinding en die opgeslagen als Latin (dus eignelijk foutloos) en probeer je dat naar een Unicode variant om te zetten?
Dat zou namelijk wat anders zijn.
Ik geef toe dat de werking/upgrade van latin1 (iso-8859-1) v.s. utf8 en de bijbehorende collaties soms best ingewikkelde materie is als je niet precies weet hoe het opgeslagen is. Tja, de data begint bij 2007, en sindsdien heb ik nooit aandacht gehad voor charactersets en collaties, en voorzover ik weet heb ik nooit wat daar mee gedaan in de tijden daarna.
Dan pas ik het script zo aan dat hij enkel de collatie/characterset van de tabellen omzet en de velden met rust laat. Dan zijn we er ook, net zoals in de tutorials.
Gewijzigd op 19/01/2022 15:42:53 door - Ariën -
Fijn dat de tutorial heeft geholpen.