mysql存储表情符号报错

迷南。 2022-05-23 11:04 497阅读 0赞

前言

博主再开发微信公众号获取用户姓名的时候,出现了很大的问题,一开始只是设计的数据库的编码为UTF-8,但是在当用户的nickName设置为表情的符号的时候就会出错,

utf8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。其中Emoji表情是4个字节,而MySql的utf8编码最多3个字节,所以导致了数据插不进去。

WX20180607-154736@2x

准备:

mysql从5.5.3开始支持utf8mb4

1、数据库表准备

再我们从utf-8修改为utf8mb4 的时候,很多的字段属性会受到影响

1.1、unique 设置的字段长度不能过长

1.2、varchar(1000) 过长的时候,要设置为text类型

1.3、为了防止出错,以后开发尽量使用这种字符格式的数据库,如果一旦表多了起来,很麻烦,大部分时候,需要我们将表进行重新执行sql。写入数据库,很麻烦的

2、修改数据库的编码集

1、这里博主用的数据库为阿里云的数据库,修改编码非常容易

WX20180607-155054@2x

修改完成之后,要注意提交参数,mysql服务器会重新启动

WX20180607-155116@2x

3、对于我们自己设置的数据库

3.1、修改mysql的配置文件/etc/mysql/my.cnf, 添加如下内容

修改mysql的配置文件/etc/mysql/my.cnf, 添加如下内容

  1. [client]
  2. default-character-set=utf8mb4
  3. [mysql]
  4. default-character-set=utf8mb4
  5. [mysqld]
  6. character-set-client-handshake=FALSE
  7. character-set-server=utf8mb4
  8. collation-server=utf8mb4_unicode_ci
  9. init_connect='SET NAMES utf8mb4'

3.2、重启数据库

  1. mysql restart

3.3、检查配置

  1. mysql> SHOW VARIABLES WHERE Variable_name LIKE 'char%' OR Variable_name LIKE 'collation%';
  2. +--------------------------+--------------------+
  3. | Variable_name | Value |
  4. +--------------------------+--------------------+
  5. | character_set_client | utf8mb4 |
  6. | character_set_connection | utf8mb4 |
  7. | character_set_database | utf8mb4 |
  8. | character_set_filesystem | binary |
  9. | character_set_results | utf8mb4 |
  10. | character_set_server | utf8mb4 |
  11. | character_set_system | utf8 |
  12. | collation_connection | utf8mb4_unicode_ci |
  13. | collation_database | utf8mb4_unicode_ci |
  14. | collation_server | utf8mb4_unicode_ci |
  15. +--------------------------+--------------------+
  16. 11 rows in set (0.05 sec)
  17. mysql>
  18. collation_connection/collation_database/collation_server如果是utf8mb4_general_ci没有关系
  19. 但必须保证:
  20. character_set_client/character_se_connection/character_set_database/character_set_results/character_set_serverutf8mb4
  21. 注意: 这里出现的结果,肯能和阿里云出现的不一样,我的阿里云是这样的,但是也能够成功
  22. ---+
  23. | character_set_client | utf8 |
  24. | character_set_connection | utf8 |
  25. | character_set_database | utf8mb4 |
  26. | character_set_filesystem | binary |
  27. | character_set_results | utf8 |
  28. | character_set_server | utf8mb4 |
  29. | character_set_system | utf8 |
  30. | character_sets_dir | /u01/mysql_20170714/share/charsets/ |
  31. | collation_connection | utf8_general_ci |
  32. | collation_database | utf8mb4_unicode_ci |
  33. | collation_server | utf8mb4_general_ci |
  34. +--------------------------+-------------------------------------+

4、建库或者是更新编码

  1. 1、创建数据库
  2. create database duodian default character set utf8mb4 collate utf8mb4_unicode_ci ;
  3. 2、修改数据库
  4. ALTER DATABASE duodianyouhui CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ;
  5. 3、修改表
  6. ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
  7. 4、修改字段
  8. alter table user_info modify column nickName varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

5、最终表情入库是乱码,解决乱码请看下一章节

ContactAuthor

发表评论

表情:
评论列表 (有 0 条评论,497人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql存储表情符号

    前言 博主再开发微信公众号获取用户姓名的时候,出现了很大的问题,一开始只是设计的数据库的编码为UTF-8,但是在当用户的nickName设置为表情的符号的时候就会出错,

    相关 java存储表情符号

    > 需求:项目中需要对用户设置姓名支持输入表情符号 > 解决方案:解决的办法很简单,比如用户名字段数据库设置为varchar类型,只需要把数据库表里面这个用户名字段的字符集修