Naudokite charset utf8mb4 ir collation utf8mb4_unicode_ci MySQL ir pakeiskite juos per phpMyAdmin arba ALTER‑komandas, taip pat prisiminkite SET NAMES ryšiui
Charset (teksto rinkinys) nustato, kokius simbolius duomenų bazė gali saugoti, o collation (rikiavimas) nustato, kaip simboliai lyginami ir rūšiuojami. Netinkamas charset yra dažniausia priežastis, kodėl danų raidės (æ, ø, å) arba emoji rodomi kaip klaustukai arba mojibake (pvz., æ vietoj æ).
Naudokite utf8mb4 kaip charset ir utf8mb4_unicode_ci kaip collation. utf8mb4 palaiko visus Unicode simbolius, įskaitant emoji.
Keisti numatytąjį visai duomenų bazei (galioja tik naujoms lentelėms):
utf8mb4_unicode_ci iš išskleidžiamojo meniu.Keisti esamą lentelę (įskaitant visus jos stulpelius):
Keisti duomenų bazės numatytąjį:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Keisti lentelę ir visus jos stulpelius:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
PhpMyAdmin galite pakeisti charset pagal stulpelį: pasirinkite lentelę, spustelėkite Struktur, spustelėkite Skift šalia stulpelio ir pasirinkite naują rikiavimą stulpelio apibrėžime.
Automatiškai sugeneruokite ALTER komandas:
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';
Paleiskite rezultatą phpMyAdmin skirtuke SQL arba per komandinę eilutę.
Database charset ir ryšio charset yra du skirtingi dalykai. Net jei jūsų lentelės yra teisingai nustatytos į utf8mb4, simboliai gali būti sugadinti perkeliamas, jei ryšys tarp programos ir MySQL naudoja kitą charset.
SET NAMES utf8mb4 nustato tris sesijos kintamuosius vienu kartu:
character_set_client — ką serveris tikisi gauti iš klientocharacter_set_connection — ką serveris naudoja viduje vykdant užklausascharacter_set_results — ką serveris siunčia atgal klientuiSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Geresnės praktikos: naudokite tvarkyklės įmontuotą charset parinktį vietoje rankinio SET NAMES siuntimo. Tai užtikrina, kad taip pat funkcijos kaip mysqli_real_escape_string() ir PDO::quote() naudotų teisingą charset – priešingu atveju retai galite atverti kelią SQL injekcijoms.
Straipsnis iš palaikymo kategorijos: MySQL