𝗠𝗶𝗴𝗿𝗮𝘁𝗶𝗻𝗴 𝗠𝗮𝗴𝗲𝗻𝘁𝗼 𝟮 𝗳𝗿𝗼𝗺 𝘂𝘁𝗳𝟴 𝘁𝗼 𝘂𝘁𝗳𝟴𝗺𝗯𝟰
ಒಬ್ಬ ಗ್ರಾಹಕರು ತಮ್ಮ ಹೆಸರಿನಲ್ಲಿ ಎಮೋಜಿಯನ್ನು (emoji) ಬಳಸಿದ್ದರು. ಡೇಟಾಬೇಸ್ ಆ ಎಮೋಜಿಯ ನಂತರ ಹೆಸರನ್ನು ಕತ್ತರಿಸಿತು. ಲಾಗ್ಗಳಲ್ಲಿ (logs) ಯಾವುದೇ ದೋಷ (error) ಕಾಣಿಸಲಿಲ್ಲ.
ಸಮಸ್ಯೆ ಎಂದರೆ MySQL utf8. ಇದು ನಿಜವಾದ UTF-8 ಅಲ್ಲ. ಇದು ಮೂರು ಬೈಟ್ಗಳ (three-byte) ಮಿತಿಯನ್ನು ಹೊಂದಿದೆ.
ಎಮೋಜಿಗಳು ಮತ್ತು ಅನೇಕ ಆಧುನಿಕ ಚಿಹ್ನೆಗಳಿಗೆ ನಾಲ್ಕು ಬೈಟ್ಗಳ ಅವಶ್ಯಕತೆ ಇರುತ್ತದೆ. ನೀವು ಹಳೆಯ utf8 ಅನ್ನು ಬಳಸಿದರೆ, MySQL ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಕತ್ತರಿಸುತ್ತದೆ (truncates). ನಿಮ್ಮ SQL mode 'strict' ಆಗಿಲ್ಲದಿದ್ದರೆ, ಇದು ತಿಳಿಯದೆಯೇ ಸಂಭವಿಸುತ್ತದೆ. ನೀವು ತಿಳಿಯದೆಯೇ ಡೇಟಾವನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ.
ಇದಕ್ಕೆ ಪರಿಹಾರವೇ utf8mb4. ಇದು ಪ್ರತಿ ಅಕ್ಷರಕ್ಕೆ ನಾಲ್ಕು ಬೈಟ್ಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ.
ದೊಡ್ಡ Magento ಸ್ಟೋರ್ನಲ್ಲಿ ನೀವು ಕೇವಲ ಕನ್ವರ್ಷನ್ ಕಮಾಂಡ್ ಅನ್ನು (conversion command) ರನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನೀವು ಬಹುಶಃ ದೋಷವನ್ನು ಎದುರಿಸಬಹುದು. ನಿಮ್ಮ ಕೀ (key) ತುಂಬಾ ಉದ್ದವಾಗಿದೆ ಎಂದು ಆ ದೋಷವು ತಿಳಿಸುತ್ತದೆ.
ಏಕೆಂದರೆ MySQL ಸೂಚ್ಯಂಕದ ಗಾತ್ರವನ್ನು (index size) ಗರಿಷ್ಠ ಸಂಭವನೀಯ ಬೈಟ್ಗಳ ಆಧಾರದ ಮೇಲೆ ಲೆಕ್ಕಹಾಕುತ್ತದೆ. utf8 ನಲ್ಲಿ VARCHAR(255) ಕಾಲಂ 765 ಬೈಟ್ಗಳನ್ನು ಬಳಸುತ್ತದೆ. utf8mb4 ನಲ್ಲಿ, ಅದೇ ಕಾಲಂಗೆ 1020 ಬೈಟ್ಗಳ ಅಗತ್ಯವಿದೆ. ಇದು ಹಳೆಯ 767-ಬೈಟ್ ಮಿತಿಯನ್ನು ಮೀರಿದೆ.
ಇದನ್ನು ಸರಿಪಡಿಸುವುದು ಹೇಗೆ:
- innodb_large_prefix ಸಕ್ರಿಯಗೊಳಿಸಲಾದ MySQL 8.0 ಅಥವಾ MySQL 5.7 ಅನ್ನು ಬಳಸಿ. ಇದು ನಿಮ್ಮ ಮಿತಿಯನ್ನು 3072 ಬೈಟ್ಗಳಿಗೆ ಹೆಚ್ಚಿಸುತ್ತದೆ.
- ನೀವು ಹಳೆಯ ಸರ್ವರ್ ಬಳಸುತ್ತಿದ್ದರೆ, ಇಂಡೆಕ್ಸ್ ಮಾಡಿದ VARCHAR ಕಾಲಂಗಳನ್ನು 191 ಅಕ್ಷರಗಳಿಗೆ ಇಳಿಸಿ. 191 ಅಕ್ಷರಗಳು ಗುಣಿಸ 4 ಬೈಟ್ಗಳು ಎಂದರೆ 764 ಬೈಟ್ಗಳು. ಇದು ಮಿತಿಯೊಳಗೆ ಇರುತ್ತದೆ.
ಯಶಸ್ವಿ ಮೈಗ್ರೇಶನ್ಗೆ ಮೂರು ಹಂತಗಳು ಬೇಕಾಗುತ್ತವೆ:
- ಡೇಟಾಬೇಸ್ ಮತ್ತು ಟೇಬಲ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ. ALTER TABLE CONVERT TO CHARACTER SET utf8mb4 ಬಳಸಿ. ಇದು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಡೇಟಾವನ್ನು ಮರುಬರೆಯುತ್ತದೆ.
- ನಿಮ್ಮ my.cnf ಫೈಲ್ನಲ್ಲಿ ಸರ್ವರ್ ಡಿಫಾಲ್ಟ್ಗಳನ್ನು (server defaults) ಅಪ್ಡೇಟ್ ಮಾಡಿ. ಇದು ಹೊಸ ಟೇಬಲ್ಗಳು ಸರಿಯಾದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಸುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
- ಅಪ್ಲಿಕೇಶನ್ ಕನೆಕ್ಷನ್ ಚಾರ್ಸೆಟ್ ಅನ್ನು (application connection charset) ಅಪ್ಡೇಟ್ ಮಾಡಿ. ಕನೆಕ್ಷನ್ utf8 ನಲ್ಲೇ ಇದ್ದರೆ, ಡೇಟಾ ಡೇಟಾಬೇಸ್ಗೆ ತಲುಪುವ ಮೊದಲೇ ಹಾಳಾಗಬಹುದು (corrupt).
ಈ ಅಪಾಯಗಳ ಬಗ್ಗೆ ಎಚ್ಚರವಿರಲಿ:
- ಟೇಬಲ್ ಲಾಕ್ಗಳು (Table locks). CONVERT TO ಇಡೀ ಟೇಬಲ್ ಅನ್ನು ಮರುಬರೆಯುತ್ತದೆ. ದೊಡ್ಡ ಟೇಬಲ್ಗಳು ಲಾಕ್ ಆಗಬಹುದು. ನಿಮ್ಮ ಸ್ಟೋರ್ ಆನ್ಲೈನ್ನಲ್ಲಿ ಇರಲು pt-online-schema-change ನಂತಹ ಪರಿಕರಗಳನ್ನು ಬಳಸಿ.
- ಕೊಲೇಶನ್ ವ್ಯತ್ಯಾಸಗಳು (Collation mismatches). ಎಲ್ಲಾ ಜಾಯಿನ್ ಮಾಡಿದ ಟೇಬಲ್ಗಳು ಒಂದೇ ಕೊಲೇಶನ್ ಅನ್ನು ಹೊಂದಿರಬೇಕು. ನಿಮ್ಮ ಇಡೀ ಸ್ಕೀಮಾದಲ್ಲಿ (schema) utf8mb4_unicode_ci ಬಳಸಿ.
ನೀವು ಇನ್ನೂ utf8 ಬಳಸುತ್ತಿದ್ದರೆ, ನಿಮ್ಮ ಸ್ಟೋರ್ Unicode-ಸುರಕ್ಷಿತವಾಗಿಲ್ಲ. ತಪ್ಪು ಅಕ್ಷರವು ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಾಳುಮಾಡುವವರೆಗೆ ನೀವು ಕಾಯುತ್ತಿದ್ದೀರಿ ಅಷ್ಟೆ.
