Well, sort of.
Java and Javascript use 2-byte strings in memory, yet both can represent an emoji just fine. (They do so via a hack that uses multiple indices in a String to represent a single character. If you want to go down the rabbit hole of how much this sucks, check out the MDN pages for charCodeAt vs codePointAt ...)
Modern languages like Go just represent strings as UTF8 in memory. This has lots of advantages:
- Most strings are mostly 1-byte-per-character, saving memory
- Full Unicode support.
- Faster IO, since you don't have to re-encode UTF8 strings to/from the network or disk.
MySQL did something weird and enormously stupid with its `utf8` encoding. It supports up-to-3-byte-per-character UTF8. This is idiosyncratic, nobody else does this. It supports some emoji
and some Chinese characters but not others.
Fortunately, you don't have to worry about it or learn about it. When using MySQL, just always use utf8mb4 ; never use utf8.