Du blander API'er her, mysql_*
og mysqli_*
blander sig ikke. Du bør holde dig til mysqli_
(som det ser ud til at du er), som mysql_*
funktioner er forældede og fjernes helt i PHP7.
Dit faktiske problem er et tegnsætproblem et eller andet sted. Her er et par tips, som kan hjælpe dig med at få det rigtige tegnsæt til din applikation. Dette dækker det meste af de generelle problemer, man kan støde på, når man udvikler en PHP/MySQL-applikation.
- ALLE attributter i hele din ansøgning skal indstilles til UTF-8
- Gem dokumentet som UTF-8 uden BOM (hvis du bruger Notepad++, er det
Format
->Convert to UTF-8 w/o BOM
) -
Headeren i både PHP og HTML skal indstilles til UTF-8
-
HTML (inde i
<head></head>
tags):<meta charset="UTF-8">
-
PHP (øverst i din fil, før ethvert output):
header('Content-Type: text/html; charset=utf-8');
-
-
Når du opretter forbindelse til databasen, skal du indstille tegnsættet til UTF-8 for dit forbindelsesobjekt, sådan her (direkte efter tilslutning)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */
Dette er for
mysqli_*
, der er lignende formysql_*
og BOB (se nederst i dette svar). -
Sørg også for, at din database og tabeller er sat til UTF-8, det kan du gøre sådan her:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(Alle data, der allerede er gemt, vil ikke blive konverteret til det korrekte tegnsæt, så du bliver nødt til at gøre dette med en ren database, eller opdatere dataene efter at have gjort dette, hvis der er ødelagte tegn).
- Hvis du bruger
json_encode()
, skal du muligvis anvendeJSON_UNESCAPED_UNICODE
flag, ellers vil det konvertere specialtegn til deres hexadecimale ækvivalent.
Husk at ALT i hele din pipeline af kode skal indstilles til UFT-8, ellers kan du opleve ødelagte tegn i din applikation.
Ud over denne liste kan der være funktioner, der har en specifik parameter til at specificere et tegnsæt. Manualen vil fortælle dig om dette (et eksempel er htmlspecialchars()
).
Der er også specielle funktioner til multibyte-tegn, f.eks.:strtolower()
vil ikke sænke multibyte-tegn, for det skal du bruge mb_strtolower()
, se denne live demo
.
Bemærkning 1 :Bemærk, at det et sted er noteret som utf-8
(med bindestreg) og et sted som utf8
(uden det). Det er vigtigt, at du ved, hvornår du skal bruge hvilken, da de normalt ikke er udskiftelige. For eksempel ønsker HTML og PHP utf-8
, men det gør MySQL ikke.
Bemærkning 2 :I MySQL er "charset" og "collation" ikke det samme, se Forskel mellem kodning og sortering?
. Begge bør dog indstilles til utf-8; generelt bør sortering enten være utf8_general_ci
eller utf8_unicode_ci
, se UTF-8:Generelt? Beholder? Unicode?
.
Bemærkning 3 :Hvis du bruger emojis, skal MySQL angives med en utf8mb4
tegnsæt i stedet for standarden utf8
, både i databasen og forbindelsen. HTML og PHP vil kun have UTF-8
.
Indstilling af UTF-8 med mysql_
og BOB
-
PDO:Dette gøres i dit objekts DSN. Bemærk
charset
attribut,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:Dette gøres meget ligmysqli_*
, men det tager ikke forbindelsesobjektet som det første argument.mysql_set_charset('utf8');