MySQL utf8mb4,保存Emojis时出错

我尝试从我的MySQL数据库中的服务中保存用户的名字。 这些名称可以包含像🙈😂😱🍰这样的emojis(仅举例)

search一下后,我发现这个链接到本教程的 stackoverflow 。 我按照步骤,它看起来像一切正常configuration。

我有一个数据库(charset和collat​​ion设置为utf8mb4(_unicode_ci)),一个名为TestTable的表,还configuration了这种方式,以及一个“文本”列,configuration这种方式(VARCHAR(191)utf8mb4_unicode_ci)。

当我尝试保存表情符号时出现错误:

Example of error for shortcake (🍰): Warning: #1300 Invalid utf8 character string: 'F09F8D' Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1 

我能够正确保存的唯一表情符号是太阳☀️

虽然我没有尝试所有这些都是诚实的。

有什么我在configuration中丢失?

请注意:所有的保存testing都不涉及客户端。 我使用phpmyadmin手动更改值并保存数据。 所以客户端的正确configuration是在服务器正确保存emojis 之后我会照顾的。

另一个旁注 :目前,当保存emojis我得到上面的错误,或不会出现错误, Username 🍰的数据将被存储为Username ???? 。 错误或没有错误取决于我保存的方式。 当通过SQL语句创build/保存时,我用问号保存,当编辑内联时,我用问号保存,当使用编辑button进行编辑时,我得到错误。

谢谢

编辑1:好,所以我想我发现了问题,但不是解决scheme。 它看起来像数据库特定variables没有正确更改。

当我在我的服务器上以root身份login并读出variables(全局)时:
使用的查询: SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

 +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ 10 rows in set (0.00 sec) 

对于我的数据库(在phpmyadmin,相同的查询),它看起来像下面这样:

 +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ 

如何在特定数据库上调整这些设置? 即使我有默认的第一个显示的设置,当创build一个新的数据库,我得到第二个作为设置。

**编辑2:“”

这是我的my.cnf文件:

 [client] port=3306 socket=/var/run/mysqld/mysqld.sock default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld_safe] socket=/var/run/mysqld/mysqld.sock [mysqld] user=mysql pid-file=/var/run/mysqld/mysqld.pid socket=/var/run/mysqld/mysqld.sock port=3306 basedir=/usr datadir=/var/lib/mysql tmpdir=/tmp lc-messages-dir=/usr/share/mysql log_error=/var/log/mysql/error.log max_connections=200 max_user_connections=30 wait_timeout=30 interactive_timeout=50 long_query_time=5 innodb_file_per_table character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci !includedir /etc/mysql/conf.d/ 

character_set_client_connection_results必须是_results才能被utf8mb4

某个地方正在单独设置一个子集。 翻遍my.cnf和phpmyadmin的设置 – 有些不是全部设置。

如果SET NAMES utf8mb4被执行,所有三个设置都正确。

太阳照耀,因为它只有3字节 – E2 98 80 ; utf8足以用于Unicode字符的3字节utf8编码。

客户端字符集很可能是您的服务/应用程序使用“utf8”而不是“utf8mb4”连接。 这取决于客户端应用程序。

对于PHP应用程序,请参阅http://php.net/manual/en/function.mysql-set-charset.php或http://php.net/manual/en/mysqli.set-charset.php

对于Python应用程序,请参阅https://github.com/PyMySQL/PyMySQL#example或http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicode

另外,检查你的列确实是utf8mb4。 一种直接的方式是这样的:

 mysql> SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_name = "user" AND column_name = "displayname"; +--------------------+ | character_set_name | +--------------------+ | utf8mb4 | +--------------------+ 1 row in set (0.00 sec) 

对我来说,事实certificate,问题谎言在MySQL客户端。

mysql客户端更新my.cnf在服务器上的字符设置,导致意外的字符设置。

所以,我需要做的只是添加character-set-client-handshake = FALSE 。 它禁止客户端设置干扰我的字符设置。

my.cnf会是这样的。

 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 ... 

希望能帮助到你。