То, что у вас есть, EXTRATERRESTRIAL ALIEN (U+1F47D)
а BROKEN HEART (U+1F494)
что нет, находится в базовой многоязычной плоскости. Они даже не могут быть представлены в Java как один символ "👽💔".length() == 4
. Это определенно не нулевые символы, и вы увидите квадраты, если вы не используете шрифты, которые их поддерживают.
MySQL utf8
поддерживает только базовую многоязычную плоскость, и utf8mb4
вместо этого вам нужно использовать :
Для дополнительного символа utf8 вообще не может хранить символ, а utf8mb4 требует четыре байта для его хранения. Поскольку utf8 вообще не может хранить символ, у вас нет дополнительных символов в столбцах utf8, и вам не нужно беспокоиться о преобразовании символов или потере данных при обновлении данных utf8 из более старых версий MySQL.
Итак, чтобы поддерживать эти символы, ваш MySQL должен быть 5.5+, и вам нужно использовать его utf8mb4
везде. Кодировка соединения должна быть utf8mb4
, набор символов должен быть utf8mb4
и коллизия должна быть utf8mb4
. Для java это все еще справедливо "utf-8"
, но MySQL требует особого подхода.
Я не знаю, какой драйвер вы используете, но независимый от драйвера способ установить кодировку соединения - это отправить запрос:
SET NAMES 'utf8mb4'
Сразу после подключения.
См. Также это для Connector / J :
14.14: Как я могу использовать 4-байтовый UTF8, utf8mb4 с Connector / J?
Чтобы использовать 4-байтовый UTF8 с Connector / J, настройте сервер MySQL с character_set_server = utf8mb4. Connector / J будет использовать этот параметр,
если в строке подключения не задано characterEncoding . Это эквивалентно автоопределению набора символов.
Также настройте столбцы и базу данных:
var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
Опять же, ваша версия MySQL должна быть относительно актуальной для поддержки utf8mb4.