CHAR(...) CHARACTER SET utf8
always takes 3 bytes per character --
CHAR(100) occupies 300 bytes (no length needed). [The "ROW FORMAT" impacts the details of this statement.]
VARCHAR occupies 1-2 bytes for a length, plus only as many bytes as needed. So
hello will occupy 7 (2+5) bytes in any character set.
CHARACTER SET latin1, take 5 bytes (plus length). In utf8, it takes 6 bytes (plus length). This is because
ñ is the 1-byte hex
F1 in latin1 or the 2-byte
C3B1 for utf8.
Some Chinese characters and some Emoji, need 4 bytes, so
utf8mb4 is a better choice for them.
There is very little use for ever using
CHAR instead of
VARCHAR. They are usually for consistent-length fields such as postal code, country code, md5, uuid, etc. And all of those may as well be
CHARACTER SET ascii or possibly
latin1, but not
Back to your question... With
CHARACTER SET utf8 (or utf8mb4):
- English letters take 1 byte.
- Western European accented letters take 2 bytes.
- Greek, Hebrew, and other languages in that general area, take 2 bytes.
- Japanese and Korean take 3 bytes.
- Most Chinese characters are 3 bytes; some are 4 and need utf8mb4.
- A longer list
"mysql will physically store characters using 1 byte for latin and 3 bytes for CJK" is not phrased correctly. Change 'latin' to 'English' to make it correct. ('Latin' tends to include various accented characters.)