Izmantojiet charset utf8mb4 un collation utf8mb4_unicode_ci MySQL, un mainiet tos, izmantojot phpMyAdmin vai ALTER komandas, atcerieties arī izmantot SET NAMES savienojumam.
Charset (tegnsæt) nosaka, kādas rakstzīmes datubāze var saglabāt, un collation nosaka, kā rakstzīmes tiek salīdzinātas un kārtotas. Nepareizs charset ir visbiežākā iemesla dēļ, kādā dāņu burti (æ, ø, å) vai emocijzīmes tiek parādīti kā jautājuma zīmes vai mojibake (piemēram, æ vietā æ).
Izmantojiet utf8mb4 kā charset un utf8mb4_unicode_ci kā collation. utf8mb4 atbalsta visus Unicode rakstzīmes, ieskaitot emocijzīmes.
Mainīt noklusējumu visai datu bāzei (attiecas tikai uz jaunām tabulām):
utf8mb4_unicode_ci nolaižamajā izvēlnē.Mainīt esošu tabulu (iekļaujot visus tās kolonnas):
Mainīt datu bāzes noklusējumu:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Mainīt tabulu un visus tās kolonnas:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
phpMyAdmin varat mainīt charset katrai kolonnai: izvēlieties tabulu, klikšķiniet Struktūra, klikšķiniet Mainīt blakus kolonnai, un izvēlieties jaunu kārtošanu kolonnas definīcijā.
Ģenerēt ALTER komandas automātiski:
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';
Izpildiet rezultātu phpMyAdmin cilnē SQL vai caur komandrindu.
Datu bāzes charset un savienojuma charset ir divas atšķirīgas lietas. Pat ja jūsu tabulas ir pareizi iestatītas uz utf8mb4, rakstzīmes var tikt bojātas pārsūtīšanas laikā, ja savienojums starp lietojumprogrammu un MySQL izmanto citu charset.
SET NAMES utf8mb4 uzstāda trīs sesijas mainīgos vienlaicīgi:
character_set_client — ko serveris sagaida saņemt no klientacharacter_set_connection — ko serveris izmanto iekšēji pieprasījumu apstrādēcharacter_set_results — ko serveris sūta atpakaļ klientamSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Labāka prakse: izmantot draivera iebūvēto charset opciju nevis manuāli sūtīt SET NAMES. Tas nodrošina, ka arī funkcijas kā mysqli_real_escape_string() un PDO::quote() lieto pareizo charset — citādi retos gadījumos varat atvērt iespējas SQL injekcijai.
Raksts no atbalsta kategorijas: MySQL