Simply.com is available in english

Charset ir collation MySQL duomenų bazėje

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 æ).

Rekomenduojamos reikšmės

Naudokite utf8mb4 kaip charset ir utf8mb4_unicode_ci kaip collation. utf8mb4 palaiko visus Unicode simbolius, įskaitant emoji.

Būdas 1: phpMyAdmin

Keisti numatytąjį visai duomenų bazei (galioja tik naujoms lentelėms):

  1. Prisijunkite prie phpMyAdmin ir pasirinkite duomenų bazę kairėje pusėje.
  2. Spustelėkite skirtuką Operationer.
  3. Raskite skyrių Sortering (Collation).
  4. Pasirinkite utf8mb4_unicode_ci iš išskleidžiamojo meniu.
  5. Spustelėkite Udfør.

Keisti esamą lentelę (įskaitant visus jos stulpelius):

  1. Pasirinkite lentelę kairėje pusėje.
  2. Spustelėkite skirtuką Operationer.
  3. Skiltyje Tabelvalgmuligheder pasirinkite naują rikiavimą.
  4. Pažymėkite Skift også sortering for alle kolonner.
  5. Spustelėkite Udfør.

Būdas 2: SQL

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.

Konvertuoti visas lenteles vienu metu

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ę.

Ryšio charset (SET NAMES)

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š kliento
  • character_set_connection — ką serveris naudoja viduje vykdant užklausas
  • character_set_results — ką serveris siunčia atgal klientui
SET 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

Kiti susiję straipsniai