Anda mencampur API di sini,
mysql_*
danmysqli_*
tidak bercampur. Anda harus tetap menggunakanmysqli_
(seperti yang Anda lihat), sebagaimysql_*
fungsi sudah usang, dan dihapus seluruhnya di PHP7.
Masalah Anda yang sebenarnya adalah masalah rangkaian karakter di suatu tempat. Berikut adalah beberapa petunjuk yang dapat membantu Anda mendapatkan rangkaian karakter yang tepat untuk aplikasi Anda. Ini mencakup sebagian besar dari masalah umum yang dapat dihadapi seseorang ketika mengembangkan aplikasi PHP/MySQL.
- SEMUA atribut di seluruh aplikasi Anda harus disetel ke UTF-8
- Simpan dokumen sebagai UTF-8 tanpa BOM (Jika Anda menggunakan Notepad++, ini adalah
Format
->Convert to UTF-8 w/o BOM
) -
Header di PHP dan HTML harus disetel ke UTF-8
-
HTML (di dalam
<head></head>
tag):<meta charset="UTF-8">
-
PHP (di bagian atas file Anda, sebelum keluaran apa pun):
header('Content-Type: text/html; charset=utf-8');
-
-
Saat menghubungkan ke database, setel charset ke UTF-8 untuk objek koneksi Anda, seperti ini (langsung setelah terhubung)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */
Ini untuk
mysqli_*
, ada yang serupa untukmysql_*
dan PDO (lihat bagian bawah jawaban ini). -
Pastikan juga database dan tabel Anda disetel ke UTF-8, Anda dapat melakukannya seperti ini:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(Data apa pun yang sudah disimpan tidak akan dikonversi ke rangkaian karakter yang tepat, jadi Anda harus melakukannya dengan database yang bersih, atau memperbarui data setelah melakukan ini jika ada karakter yang rusak).
- Jika Anda menggunakan
json_encode()
, Anda mungkin perlu menerapkanJSON_UNESCAPED_UNICODE
flag, jika tidak maka akan mengubah karakter khusus menjadi setara heksadesimalnya.
Ingatlah bahwa SEGALANYA di seluruh saluran kode Anda perlu disetel ke UFT-8, jika tidak, Anda mungkin mengalami karakter yang rusak di aplikasi Anda.
Selain daftar ini, mungkin ada fungsi yang memiliki parameter khusus untuk menentukan rangkaian karakter. Manual akan memberi tahu Anda tentang ini (contohnya adalah htmlspecialchars()
).
Ada juga fungsi khusus untuk karakter multibyte, contoh:strtolower()
tidak akan menurunkan karakter multibyte, untuk itu Anda harus menggunakan mb_strtolower()
, lihat demo langsung ini
.
Catatan 1 :Perhatikan bahwa suatu tempat dicatat sebagai
utf-8
(dengan tanda hubung), dan di suatu tempat sebagaiutf8
(tanpa itu). Penting bagi Anda untuk mengetahui kapan harus menggunakan yang mana, karena biasanya tidak dapat dipertukarkan. Misalnya, HTML dan PHP menginginkanutf-8
, tetapi MySQL tidak.Catatan 2 :Di MySQL, "charset" dan "collation" bukanlah hal yang sama, lihat Perbedaan antara Encoding dan collation? . Keduanya harus disetel ke utf-8; umumnya susunan harus berupa
utf8_general_ci
atauutf8_unicode_ci
, lihat UTF-8:Umum? Tempat sampah? Unicode? .Catatan 3 :Jika Anda menggunakan emoji, MySQL harus ditentukan dengan
utf8mb4
charset alih-alihutf8
standar , baik dalam database maupun koneksi. HTML dan PHP hanya akan memilikiUTF-8
.
Menyetel UTF-8 dengan mysql_
dan PDO
-
PDO:Ini dilakukan di DSN objek Anda. Perhatikan
charset
atribut,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:Ini dilakukan sangat mirip denganmysqli_*
, tetapi tidak mengambil objek koneksi sebagai argumen pertama.mysql_set_charset('utf8');