Du blandar API:er här,
mysql_*
ochmysqli_*
blandas inte. Du bör hålla dig tillmysqli_
(som du verkar vara i alla fall), sommysql_*
funktioner är utfasade och tas bort helt i PHP7.
Ditt faktiska problem är ett teckenuppsättningsproblem någonstans. Här är några tips som kan hjälpa dig att få rätt teckenuppsättning för din applikation. Detta täcker det mesta av de allmänna problem man kan möta när man utvecklar en PHP/MySQL-applikation.
- ALLA attribut i hela din ansökan måste ställas in på UTF-8
- Spara dokumentet som UTF-8 utan BOM (om du använder Notepad++ är det
Format
->Convert to UTF-8 w/o BOM
) -
Rubriken i både PHP och HTML bör ställas in på UTF-8
-
HTML (inuti
<head></head>
taggar):<meta charset="UTF-8">
-
PHP (högst upp i filen, före någon utdata):
header('Content-Type: text/html; charset=utf-8');
-
-
När du ansluter till databasen, ställ in teckenuppsättningen till UTF-8 för ditt anslutningsobjekt, så här (direkt efter anslutning)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */
Detta är för
mysqli_*
, det finns liknande förmysql_*
och PDO (se längst ner i detta svar). -
Se också till att din databas och tabeller är inställda på UTF-8, du kan göra det så här:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(All data som redan lagrats kommer inte att konverteras till rätt teckenuppsättning, så du måste göra detta med en ren databas, eller uppdatera data efter att ha gjort detta om det finns trasiga tecken).
- Om du använder
json_encode()
, kan du behöva användaJSON_UNESCAPED_UNICODE
flagga, annars konverterar den specialtecken till deras hexadecimala motsvarighet.
Kom ihåg att ALLT i hela din pipeline av kod måste ställas in på UFT-8, annars kan du uppleva trasiga tecken i din applikation.
Utöver den här listan kan det finnas funktioner som har en specifik parameter för att specificera en teckenuppsättning. Manualen kommer att berätta om detta (ett exempel är htmlspecialchars()
).
Det finns också specialfunktioner för multibyte-tecken, till exempel:strtolower()
kommer inte att sänka multibyte-tecken, för det måste du använda mb_strtolower()
, se denna live-demon
.
Anmärkning 1 :Lägg märke till att det någonstans noterats som
utf-8
(med ett bindestreck), och någonstans somutf8
(utan det). Det är viktigt att du vet när du ska använda vilka, eftersom de vanligtvis inte är utbytbara. Till exempel vill HTML och PHP hautf-8
, men MySQL gör det inte.Anmärkning 2 :I MySQL är "charset" och "kollation" inte samma sak, se Skillnaden mellan kodning och sortering? . Båda bör dock ställas in på utf-8; i allmänhet bör sortering vara antingen
utf8_general_ci
ellerutf8_unicode_ci
, se UTF-8:Allmänt? Bin? Unicode? .Anmärkning 3 :Om du använder emojis måste MySQL anges med en
utf8mb4
teckenuppsättning istället för standardenutf8
, både i databasen och anslutningen. HTML och PHP kommer bara att haUTF-8
.
Ställa in UTF-8 med mysql_
och SUB
-
PDO:Detta görs i DSN för ditt objekt. Notera
charset
attribut,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:Detta görs mycket liktmysqli_*
, men det tar inte anslutningsobjektet som det första argumentet.mysql_set_charset('utf8');