Käytä charset‑ä utf8mb4 ja collationia utf8mb4_unicode_ci MySQL:ssa ja vaihda ne phpMyAdminin tai ALTER‑komentojen avulla, muista myös SET NAMES yhteyden osalta.
Charset (tegnsæt) määrää, mitä merkkejä tietokanta voi tallentaa, ja collation määrittää, miten merkit verrataan ja lajitellaan. Väärä charset on yleisin syy siihen, että tanskankieliset kirjaimet (æ, ø, å) tai emojit näkyvät kysymysmerkkeinä tai mojibakeina (esim. æ i stedet for æ).
Käytä utf8mb4 charsetina ja utf8mb4_unicode_ci collationina. utf8mb4 tukee kaikkia Unicode-merkkejä, myös emojeja.
Vaihda oletus koko tietokannalle (koskee vain uusia tauluja):
utf8mb4_unicode_ci pudotusvalikosta.Vaihda olemassa oleva taulu (sisältäen kaikki sen sarakkeet):
Vaihda tietokannan oletus:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Vaihda taulu ja kaikki sen sarakkeet:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
phpMyAdminissa voit vaihtaa charset per sarake: valitse taulu, napsauta Rakenne, napsauta sarakkeen vieressä olevaa Vaihda, ja valitse uusi lajittelu sarakemäärittelyssä.
Luo ALTER-komennot automaattisesti:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
Suorita tulos phpMyAdminissa SQL-välilehden alla tai komentoriviltä.
Tietokannan charset ja yhteyden charset ovat kaksi eri asiaa. Vaikka taulusi olisivat oikein asetettu utf8mb4:een, merkit voivat vioittua siirrossa, jos sovelluksen ja MySQL:n välinen yhteys käyttää eri charsetia.
SET NAMES utf8mb4 asettaa kolme istuntomuuttujaa kerralla:
character_set_client – mitä palvelin odottaa vastaanottavansa asiakkaaltacharacter_set_connection – mitä palvelin käyttää sisäisesti kyselyn käsittelyn aikanacharacter_set_results – mitä palvelin lähettää takaisin asiakkaalleSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Parempi käytäntö: käytä ohjaimen sisäänrakennettua charset-option sen sijaan, että lähettäisit SET NAMES manuaalisesti. Tämä varmistaa, että myös funktiot kuten mysqli_real_escape_string() ja PDO::quote() käyttävät oikeaa charsetia – muuten voit harvinaisissa tapauksissa avata SQL-injektiohaavoittuvuuden.
Ohje Ohjekirjastosta: MySQL