前言
一个软件系统最重要的是什么?毫无疑问是数据,那什么是数据的'运载体',什么作为后端与数据库的桥梁和沟通者呢,是SQL。我是Java开发出身,大学课程当时学习的是SQL Server,而且后面工作中实际用到过Oracle,DB2以及使用的最普遍的My SQL,至于No SQL 这一类下的常用的就是Redis和MongoDB了,这些后面再详细举例说明。今天讲的案列与表情相关,那么接下来进入今天的主题。
主题:
当发现Mysql不支持emoji表情时你是怎么办的?注:版本5.1.13及以上
问题阐释:
数据库接收到表情会是什么情况导致的?
案例:
在开发系统时,用户体系是重中之重,所以联合登录这种事情就很普遍了,一般是微信联合登录,当然还有支付宝或者第三方的联合登录比如一键登录这种的,而在微信联合登录中,最容易出现问题的就是微信的'用户名',如果是规规矩矩的中文或者中文+英文都无所谓,有的是稀奇古怪的在用户名上加了表情,这就让人很难受了,当有这种用户联合登录即微信授权登录进来以后,入库就报错,错误是什么呢?看看下面的这个报错是不是很熟悉。
意思就是当前数据库的编码(字符集)不是utf8mb4的,不支持表情,那遇到这种情况怎么办呢,
解决方案
1)修改数据库的字符集为utf8mb4,重启数据库后生效,这种最快,而且不涉及到修改代码再发版,产品同意的概率很大
2)在接口中添加过滤,把用户名中的表情替换掉,这种方法的话,需要修改代码和发版,如果用户很多而且现有环境不支持蓝绿发布或者负载均衡那产品肯定不同意这种方案
那有没有更好的方案呢,实际上目前就这两种方案,而最优的方案是在系统最初设计和规划时就应该想到会有这种情况,那有人会说了我怎么知道系统后面的事情,这个问题就是经验积累了,就是要有所谓的系统前瞻性,只有踩的坑多了我们才能在后面的开发中避开这些坑,架构师也是从坑里爬出来的,当然架构师踩的坑那就更多了,而我们这种普通开发呢,我们能做的就是记好每次踩的是什么坑,下次,下下次不踩进同一个坑里就行了。
重要提示:
上面说到了数据的重要性,那数据库的备份肯定不能少,所以也顺便提及一下数据库备份的知识点
1)开启binlog日志,防止误删除,就算删除了也能同binlog日志找回来,另外设计数据库时尽量做逻辑删除而不是物理删除,就加一个is_delete的字段删除时置为1,未删除为0
2)可以将整个数据库同步到另外一个服务器上,当然数据是增量同步,即使A服务器的数据库中病毒,B也能保全数据
小结
关于My SQL的要点和坑真的很多,这里只是找几个典型的来说明。今天的问题及解决方案就讲到这里,我们明天继续。fighting......