3 ms·
You must be confusing UTF-8 with 4-byte Unicode. UTF-8 by design will use variable length encoding, otherwise it's not UTF-8. I can confirm both these commands
by nvivo 9y ago
You must be confusing UTF-8 with 4-byte Unicode. UTF-8 by design will use variable length encoding, otherwise it's not UTF-8.
I can confirm both these commands return 36 in my mysql installation:
SELECT LENGTH('15c915fc-4d50-11e7-9bc7-50b7c307c620' COLLATE utf8_general_ci);
SELECT LENGTH('15c915fc-4d50-11e7-9bc7-50b7c307c620' COLLATE utf8mb4_general_ci);
- pornel 9y agoNope, tveita is right. MySQL's storage has some space limits defined in terms of bytes, and to express that in terms of characters it has to allow for the worst case. If it allowed 255-byte space to be used as VARCHAR(255) in UTF-8, then an insert of 255-character long string with emojis would fail.
- nvivo 9y agoThat's not a real issue. I can understand this may bite some people that don't read the docs or don't understand encoding, but it's more misinformation than a technical problem. UTF-8 is variable length anywhere, not just inside mysql. If you don't want this behavior, you can either use UCS-2 or UTF-32. UTF-16 and UTF-8 are variable length encodings, period. Most databases that have use char length for unicode actually work with UCS-2, and use 2 bytes per char, like MS SQL Server.
- nvivo 9y agoNot sure what deserved a downvote here... Is there anything incorrect?
- pornel 9y agoIt's not incorrect, but a strawman (I didn't downvote you btw). The question was why UTF-8 in MySQL has weird limits. It wasn't about what MySQL should have done in an alternative universe.
- nvivo 9y agoYeah, but I didn't point out what mysql should have done in an alternative universe. Mysql DOES support fixed lenght unicode, just use the correct encoding: ucs2 or utf32. What it does with utf-8 is what any system that supports utf-8 must do.
- kpcyrd 9y agoThe name VARCHAR is confusing since it's not properly defined what a character is. 1 byte? Something on the unicode table? If it'd be named VARBYTE(255) it would be pretty obvious that a 255-emoji-string insert would fail. https://eev.ee/blog/2015/09/12/dark-corners-of-unicode/ https://eev.ee/blog/2015/09/12/dark-corners-of-unicode/