Поддерживает ли mysql latin1 также символ эмодзи?

Теперь из-за нижеприведенного явления я чувствую, что совершенно не понимаю набор символов. Сначала я думаю, что только utf8mb4 поддерживает символ Emoji, например. ????. Смотри ниже:

As of MySQL 5.5.3, the utf8mb4 character set uses a maximum of four bytes per character supports supplemental characters

Но случайно обнаружил это явление, см. ниже:

mysql> show variables like 'character%';
+--------------------------+---------------------------------------+
| Variable_name            | Value                                 |
+--------------------------+---------------------------------------+
| character_set_client     | latin1                                |
| character_set_connection | latin1                                |
| character_set_database   | latin1                                |
| character_set_filesystem | binary                                |
| character_set_results    | latin1                                |
| character_set_server     | utf8mb4                               |
| character_set_system     | utf8                                  |
| character_sets_dir       | /opt/mysql/server-5.6/share/charsets/ |
+--------------------------+---------------------------------------+
mysql> show create table t4\G
*************************** 1. row ***************************
   Table: t4
Create Table: CREATE TABLE `t4` (
  `data` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
mysql> insert into t4 select '\U+1F600';
mysql> select * from t4;
+------+
| data |
+------+
| ????     |
+------+

Теперь я очень смущен, кажется, что latin1 также может поддерживать символ смайликов. Я знаю, что это должно быть иллюзия, но я не знаю, как ее очистить?


person zhuguowei    schedule 12.05.2015    source источник
comment
Я думаю, вы сохранили и извлекли из базы данных строку байтов, которая интерпретируется терминалом как символ Unicode. Проверьте вывод SELECT LENGTH(data), CHAR_LENGTH(data) FROM t4, чтобы увидеть, что происходит. Они должны возвращать разные значения для многобайтовых символов и одно и то же значение для latin1.   -  person axiac    schedule 12.05.2015
comment
@axiac Ты прав. Значения длины (данные) и char_length (данные) равны 4. Вы имеете в виду, что хотя в среде интерактивного интерфейса mysql набор символов равен latin1, но на самом деле клиент mysql использует набор символов ОС по умолчанию (utf8). То есть клиент mysql использует utf8 для кодирования этого символа emoji в f0 9f 98 80, а затем помещает их в столбец данных. Когда вы извлекаете его, клиент mysql использует utf8 для декодирования его в правильный символ смайликов. Итак, если бы я мог сделать вывод, что в интерактивном интерфейсе mysql выполнение имен наборов не имеет смысла, потому что он всегда использует символ os.   -  person zhuguowei    schedule 12.05.2015


Ответы (1)


Вы не можете хранить в поле latin1 ничего, кроме символов iso-8859-1. без преобразования его, например. base64

Это может сработать, но позже в какой-то момент произойдет сбой. В специальных многобайтовых символах вроде смайликов.

person frlan    schedule 12.05.2015