ITPub博客

首页 > 数据库 > MySQL > 【Mysql】关于mysql存入emoji表情的问题

【Mysql】关于mysql存入emoji表情的问题

原创 MySQL 作者:小亮520cl 时间:2016-08-22 11:53:36 0 删除 编辑
1.测试插入脚本
  1. <?php
  2. $conn = mysql_connect("127.0.0.1","root","ESBecs00!@#") or die ("wrong!");
  3. $sel=mysql_select_db("test",$conn);
  4. $contents = <<<EOT
  5. "\ud83d\udca5"
  6. EOT;

  7. $contents = json_decode($contents). "hello";
  8. echo $contents, "\t\n";

  9. $sql="insert into testtab (`contents`) VALUES('$contents')";


  10. for($i = 0;$i<1;$i++)
  11. {
  12.         $que=mysql_query($sql,$conn);
  13.         while ($row = mysql_fetch_assoc($que)) {
  14.                 var_dump($row);
  15.         }

  16. }


  17. mysql_close($conn);


  18. ?>


在utf8的背景下
  1. 数据库端字符集为
    1. mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
    2. +--------------------------+-----------------+
    3. | Variable_name | Value |
    4. +--------------------------+-----------------+
    5. | character_set_client | utf8 |
    6. | character_set_connection | utf8 |
    7. | character_set_database | utf8 |
    8. | character_set_filesystem | binary |
    9. | character_set_results | utf8 |
    10. | character_set_server | utf8 |
    11. | character_set_system | utf8 |
    12. | collation_connection | utf8_general_ci |
    13. | collation_database | utf8_unicode_ci |
    14. | collation_server | utf8_unicode_ci |
    15. +--------------------------+-----------------+

  2. 表字符集编码为
    1. mysql> show create table testtab\G;
    2. *************************** 1. row ***************************
    3.        Table: testtab
    4. Create Table: CREATE TABLE `testtab` (
    5.   `contents` text
    6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    7. 1 row in set (0.00 sec)


    运行脚本插入数据
    1. [root@host-192-168-1-56 ~]# php test.php
    2. hello

  3. 检查数据
    1. MySQL [test]> select * from testtab;                                                                             
      +----------+
      | contents |
      +----------+
      |          |
      |          |
      +----------+
    2. 空字符串 有时会报这种错: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 



若在线修改字符集
  1. mysql> ALTER TABLE testtab CONVERT TO CHARACTER SET utf8mb4;
  2. Query OK, 0 rows affected (0.34 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0

  4. mysql> alter table testtab modify column `contents` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. Query OK, 0 rows affected (0.36 sec)
  6. Records: 0 Duplicates: 0 Warnings: 0

  mysql>  show create table testtab\G;
*************************** 1. row ***************************
       Table: testtab
Create Table: CREATE TABLE `testtab` (
  `contents` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

 运行插入脚本
 检查数据
MySQL [test]> select * from testtab;
+-----------+
| contents  |
+-----------+
|           |
|           |
| ????hello | --插进去,因为没有前端测试,不知道是乱码还是正常的
+-----------+
3 rows in set (0.00 sec)


修改配置文件重启数据库
  1. [client]
  2. port=3306
  3. socket=/var/lib/mysql/mysql.sock
  4. default-character-set=utf8mb4
  5. [mysqld]
  6. character_set_server = utf8mb4
  7. collation-server = utf8mb4_unicode_ci

  1. MySQL [test]> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
    +--------------------------+--------------------+
    | Variable_name            | Value              |
    +--------------------------+--------------------+
    | character_set_client     | utf8               |
    | character_set_connection | utf8               |
    | character_set_database   | utf8mb4            |
    | character_set_filesystem | binary             |
    | character_set_results    | utf8               |
    | character_set_server     | utf8mb4            |
    | character_set_system     | utf8               |
    | collation_connection     | utf8_general_ci    |
    | collation_database       | utf8mb4_unicode_ci |
    | collation_server         | utf8mb4_unicode_ci |
    +--------------------------+--------------------+


再转换表
  1. mysql> ALTER TABLE testtab CONVERT TO CHARACTER SET utf8mb4;
  2. Query OK, 0 rows affected (0.34 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0

  4. mysql> alter table testtab modify column `contents` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. Query OK, 0 rows affected (0.36 sec)
  6. Records: 0 Duplicates: 0 Warnings: 0

运行插入脚本
查看数据
mysql> select * from testtab;
+-----------+
| contents  |
+-----------+
|           |
|           |
| ????hello |
| ?hello    |   ---这条应该是正常的,四个?的应该是乱码
+-----------+



注意:
这样是对的。
说下前提,utf8mb4和utf8的区别就是utf8才用3位字节码存储数据,而utf8mb4用4位字节码存储数据。
emoji表情是4位字节码通过前段转义出来的,它本身是不可读的字符,所以在数据库客户端中会显示“?”。
在前端支持emoji的地方就会显示emoji表情。


如果想在utf8的背景下插入emoji表情,得修改配置文件,重启数据库啊!
参考:
https://segmentfault.com/q/1010000005996045
http://blog.csdn.net/dqchouyang/article/details/51473544
http://www.tuicool.com/articles/zAnEV3
http://www.innomysql.com/article/25722.html             -----姜成尧
https://mp.weixin.qq.com/s/VWVKy16gMJ_kFeICsyMiVw   ---老叶茶馆
http://mp.weixin.qq.com/s/HjzVoWe1fky0VfzhHi8uCg  ----ACUMG mysql使用utf8mb4 经验吐血总结


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-2123781/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
毕业以后专业任职数据库工程师职位,itpub一直作为自己的笔记记录的地方,blog写的不详细,草书笔记,仅供参考!

注册时间:2013-09-12

  • 博文量
    529
  • 访问量
    1126954