The utf16le Character Set (UTF-16LE Unicode Encoding) Because  utf16  supports surrogates and  ucs2  does not, there is a validity check that applies only in utf16 : You cannot insert a top surrogate without a bottom surrogate, or vice versa. For example: There is no validity check for characters that are technically valid but are not true Unicode (that is, characters that Unicode considers to be “unassigned code points”  or “private use”  characters or even “illegals”  like  0xffff ). For example, since  U+F8FF  is the Apple Logo, this is legal: Such characters cannot be expected to mean the same thing to everyone. Because MySQL must allow for the worst case (that one character requires four bytes) the maximum length of a  utf16  column or index is only half of the maximum length for a  ucs2  column or index. For example, the maximum length of a  MEMORY  table index key is 3072 bytes, so these statements create tables with the longest permitted indexes for  ucs2  and  utf16  columns: This is the same as  utf16  but is little-endian rather than big-endian. The  utf32  character set is fixed length (like  ucs2  and unlike  utf16 ).  utf32  uses 32 bits for every character, unlike  ucs2  (which uses 16 bits for every character), and unlike  utf16  (which uses 16 bits for some characters and 32 bits for others). utf32  takes twice as much space as  ucs2  and more space than  utf16 , but  utf32  has the same advantage as  ucs2  that it is predictable for storage: The required number of bytes for  utf32  equals the number of characters times 4. Also, unlike  utf16 , there are no tricks for encoding in  utf32 , so the stored value equals the code value. To demonstrate how the latter advantage is useful, here is an example that shows how to determine a utf8mb4  value given the  utf32  code value: MySQL is very forgiving about additions of unassigned Unicode characters or private-use-area characters. There is in fact only one validity check for  utf32 : No code value may be greater than  0x10ffff . For example, this is illegal: This section describes issues that you may face when converting character data between the  utf8mb3 and  utf8mb4  character sets. 1966 10.9.8 Converting Between 3-Byte and 4-Byte Unicode Character Sets 10.9.6 The utf16le Character Set (UTF-16LE Unicode Encoding) 10.9.7 The utf32 Character Set (UTF-32 Unicode Encoding) INSERT INTO t (ucs2_column) VALUES (0xd800); /* legal */ INSERT INTO t (utf16_column)VALUES (0xd800); /* illegal */ INSERT INTO t (utf16_column)VALUES (0xf8ff); /* legal */ CREATE TABLE tf (s1 VARCHAR(1536) CHARACTER SET ucs2) ENGINE=MEMORY; CREATE INDEX i ON tf (s1); CREATE TABLE tg (s1 VARCHAR(768) CHARACTER SET utf16) ENGINE=MEMORY; CREATE INDEX i ON tg (s1); /* Assume code value = 100cc LINEAR B WHEELED CHARIOT */ CREATE TABLE tmp (utf32_col CHAR(1) CHARACTER SET utf32, utf8mb4_col CHAR(1) CHARACTER SET utf8mb4); INSERT INTO tmp VALUES (0x000100cc,NULL); UPDATE tmp SET utf8mb4_col = utf32_col; SELECT HEX(utf32_col),HEX(utf8mb4_col) FROM tmp; INSERT INTO t (utf32_column) VALUES (0x110000); /* illegal */