Gebruik mysqli_set_charset
om de clientcodering te wijzigen in UTF-8 net nadat u verbinding hebt gemaakt:
$mysqli->set_charset("utf8");
De clientcodering is waar MySql verwacht dat uw invoer zich in bevindt (bijvoorbeeld wanneer u door de gebruiker geleverde tekst invoegt in een zoekopdracht) en waarin het u de resultaten geeft (dus het moet overeenkomen met uw uitvoercodering om echo
om dingen correct weer te geven).
U moet ervoor zorgen dat het overeenkomt met de codering van uw webpagina om rekening te houden met de twee bovenstaande scenario's en de codering van het PHP-bronbestand (zodat de hardgecodeerde delen van uw zoekopdrachten correct worden geïnterpreteerd).
Update:gegevens die zijn ingevoegd met latin-1 converteren naar utf-8
Met betrekking tot gegevens die al zijn ingevoegd met de verkeerde verbindingscodering, is er een handige oplossing om het probleem op te lossen. Voor elke kolom die dit soort gegevens bevat, moet u het volgende doen:
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
De tijdelijke aanduidingen table_name
, column_name
en existing_column_type
moet elke keer worden vervangen door de juiste waarden uit uw database.
Wat dit doet is
- Vertel MySql dat het gegevens in die kolom in latin1 moet opslaan. Deze tekenset bevat slechts een kleine subset van utf8, dus in het algemeen gaat deze conversie gepaard met gegevensverlies, maar in dit specifieke scenario werden de gegevens al geïnterpreteerd als latin1 bij invoer, dus er zijn geen bijwerkingen. MySql zal echter intern de byteweergave van uw gegevens converteren om overeen te komen met wat oorspronkelijk vanuit PHP is verzonden.
- Converteer de kolom naar een binair type (
BLOB
) die geen bijbehorende coderingsinformatie heeft. Op dit punt zal de kolom onbewerkte bytes bevatten die een correcte utf8-tekenreeks zijn. - Converteer de kolom naar het vorige tekentype en vertel MySql dat de onbewerkte bytes moeten worden beschouwd als utf8-codering.
WAARSCHUWING:u kunt deze willekeurige benadering alleen gebruiken als de betreffende kolom alleen bevat onjuist ingevoerde gegevens. Alle gegevens die correct zijn ingevoegd, worden afgekapt bij het eerste voorkomen van een niet-ASCII-teken!
Daarom is het een goed idee om het nu meteen te doen, voordat de PHP-side fix van kracht wordt.