Magento 2 ని utf8 నుండి utf8mb4 కి మైగ్రేట్ చేయడం
ఒక కస్టమర్ తన పేరులో ఒక ఎమోజీని ఉపయోగించారు. డేటాబేస్ ఆ ఎమోజీ తర్వాత పేరును మధ్యలోనే కట్ చేసింది. లాగ్స్లో ఎటువంటి ఎర్రర్ కనిపించలేదు.
సమస్య MySQL utf8 లో ఉంది. ఇది నిజమైన UTF-8 కాదు. ఇది కేవలం మూడు బైట్ల పరిమితిని మాత్రమే కలిగి ఉంటుంది.
ఎమోజీలు మరియు అనేక ఆధునిక చిహ్నాలకు నాలుగు బైట్లు అవసరం. మీరు పాత utf8 ఉపయోగిస్తే, MySQL మీ డేటాను కత్తిరిస్తుంది (truncate). మీ SQL mode 'strict' గా లేకపోతే, ఇది ఎటువంటి హెచ్చరిక లేకుండా జరుగుతుంది. మీకు తెలియకుండానే మీరు డేటాను కోల్పోతారు.
దీనికి పరిష్కారం utf8mb4. ఇది ప్రతి క్యారెక్టర్ కోసం నాలుగు బైట్లను సపోర్ట్ చేస్తుంది.
పెద్ద Magento స్టోర్పై మీరు నేరుగా కన్వర్షన్ కమాండ్ను రన్ చేయలేరు. బహుశా మీకు ఒక ఎర్రర్ ఎదురవుతుంది. మీ కీ (key) చాలా పొడవుగా ఉందని ఆ ఎర్రర్ చెబుతుంది.
ఎందుకంటే MySQL ఇండెక్స్ పరిమాణాన్ని గరిష్టంగా ఉండగలిగే బైట్ల ఆధారంగా లెక్కిస్తుంది. utf8 లో VARCHAR(255) కాలమ్ 765 బైట్లను ఉపయోగిస్తుంది. utf8mb4 లో, అదే కాలమ్ 1020 బైట్లను అవసరమవుతుంది. ఇది పాత 767-బైట్ల పరిమితిని మించిపోతుంది.
దీనిని ఎలా పరిష్కరించాలి:
- innodb_large_prefix ఎనేబుల్ చేయబడిన MySQL 8.0 లేదా MySQL 5.7 ని ఉపయోగించండి. ఇది మీ పరిమితిని 3072 బైట్లకు పెంచుతుంది.
- మీరు పాత సర్వర్ని ఉపయోగిస్తుంటే, ఇండెక్స్ చేసిన VARCHAR కాలమ్స్ను 191 క్యారెక్టర్లకు తగ్గించండి. 191 క్యారెక్టర్లు x 4 బైట్లు = 764 బైట్లు అవుతుంది. ఇది పరిమితికి సరిపోతుంది.
విజయవంతమైన మైగ్రేషన్ కోసం మూడు దశలు అవసరం:
- డేటాబేస్ మరియు టేబుల్స్ను అప్డేట్ చేయండి.
ALTER TABLE CONVERT TO CHARACTER SET utf8mb4ఉపయోగించండి. ఇది ఇప్పటికే ఉన్న డేటాను తిరిగి రాస్తుంది (rewrites). - మీ my.cnf ఫైల్లో సర్వర్ డిఫాల్ట్స్ను అప్డేట్ చేయండి. దీనివల్ల కొత్త టేబుల్స్ సరైన సెట్టింగ్లను ఉపయోగిస్తాయని నిర్ధారించవచ్చు.
- అప్లికేషన్ కనెక్షన్ చార్సెట్ను (charset) అప్డేట్ చేయండి. కనెక్షన్ utf8 లోనే ఉంటే, డేటా డేటాబేస్కు చేరుకోకముందే పాడైపోతుంది (corrupt).
ఈ రిస్క్ల పట్ల జాగ్రత్తగా ఉండండి:
- టేబుల్ లాక్స్ (Table locks).
CONVERT TOమొత్తం టేబుల్ను తిరిగి రాస్తుంది. పెద్ద టేబుల్స్ లాక్ అయిపోతాయి. మీ స్టోర్ ఆన్లైన్లో ఉండటానికిpt-online-schema-changeవంటి టూల్స్ను ఉపయోగించండి. - కొలేషన్ మిస్మ్యాచ్లు (Collation mismatches). జాయిన్ చేయబడిన అన్ని టేబుల్స్ ఒకే కొలేషన్ను ఉపయోగించాలి. మీ మొత్తం స్కీమా అంతటా
utf8mb4_unicode_ciని ఉపయోగించండి.
మీరు ఇంకా utf8 ఉపయోగిస్తుంటే, మీ స్టోర్ Unicode-safe కాదు. తప్పుడు క్యారెక్టర్ మీ డేటాను పాడుచేసే వరకు మీరు వేచి చూస్తున్నట్లే.
