Brug mysqli_set_charset
for at ændre klientkodningen til UTF-8 lige efter du har oprettet forbindelse:
$mysqli->set_charset("utf8");
Klientkodningen er, hvad MySql forventer, at dit input skal være i (f.eks. når du indsætter brugerleveret tekst til en søgeforespørgsel), og hvad den giver dig resultaterne i (så den skal matche din output-kodning for at echo
for at vise tingene korrekt).
Du skal have det til at matche kodningen på din webside for at tage højde for de to scenarier ovenfor og kodningen af PHP-kildefilen (så de hårdkodede dele af dine forespørgsler fortolkes korrekt).
Opdatering:Sådan konverteres data indsat ved hjælp af latin-1 til utf-8
Med hensyn til data, der allerede er blevet indsat med den forkerte forbindelseskodning, er der en praktisk løsning til at løse problemet. For hver kolonne, der indeholder denne type data, skal du gøre:
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;
Pladsholderne table_name
, column_name
og existing_column_type
bør erstattes med de korrekte værdier fra din database hver gang.
Hvad dette gør er
- Fortæl MySql, at den skal gemme data i den kolonne på latin1. Dette tegnsæt indeholder kun en lille delmængde af utf8, så generelt involverer denne konvertering datatab, men i dette specifikke scenarie blev dataene allerede fortolket som latin1 ved input, så der vil ikke være nogen bivirkninger. Dog vil MySql internt konvertere byte-repræsentationen af dine data til at matche det, der oprindeligt blev sendt fra PHP.
- Konverter kolonnen til en binær type (
BLOB
), der ikke har nogen tilknyttet kodningsoplysninger. På dette tidspunkt vil kolonnen indeholde råbytes, der er en korrekt utf8-tegnstreng. - Konverter kolonnen til dens tidligere tegntype, og fortæl MySql, at de rå bytes skal anses for at være i utf8-kodning.
ADVARSEL:Du kan kun bruge denne vilkårlige tilgang, hvis den pågældende kolonne kun indeholder forkert indsatte data. Alle data, der er blevet indsat korrekt, vil blive afkortet ved den første forekomst af et ikke-ASCII-tegn!
Derfor er det en god idé at gøre det lige nu, før PHP-siderettelsen træder i kraft.