JAVA-and-J2EE
mysql支持存储emoji在5.5.3版本以后支持
星期一, 五月 2nd, 2016 | JAVA-and-J2EE, linux | 没有评论
在做基于办公的沟通软件中,常用一些emoji的聊天版本,发现在mysql中无法存储.
因为emoji表情在存储时转成的四个字节(\xF0\x9F\x90\xAC);
由于数据库使用的是utf8字符集utf8_general_ci,这个校对规则(collation)最大只支持3个字节,所以四个字节的emoji就会存储不全,从而取出无法显示.
简要说明
上文提到的 utf8_general_ci 与 ut8_unicode_ci 是utf8的两种字符编码方式,不同之处就是对字符的分类(sorting)和对比(comparison)。
MySQL 5.5.3及以后版本支持使用utf8mb4字符集,它在与utf8数据格式处理性能相同基础上加强了对字符码位(code point)的处理能力。与utf8对应的,utf8mb4有 utf8mb4_general_ci 和 utf8mb4_general_ci 。
utf8mb4_general_ci 基于Unicode standard sorting与comparison,支持更多的语言种类。
utf8mb4_general_ci 不能解析所有的Unicode分类规则,在一些特别的语言或字符处理上存在一定的问题。不过在性能上,它能更快的sorting、comparison,因其采用一组性能相关的快捷方式(performance-related shortcuts)。
解决办法
通过上文我们已经知道一种解决办法了,但有一个硬性条件就是你的数据库版本。当你的数据库版本没有达到5.5.3怎么办呢…总结一下,mysql支持存储emoji表情的方法,至少有两种。
1.修改数据库编码为utf8mb4,前提是你的mysql数据库版本必须得是5.5.3及以后的
2.将带emoji的文本转为base64来进行存储,返回时进行相应解码返回
下面介绍我如何使用第一种方法:
将数据库编码由utf8改为utf8mb4
set character_set_client = utf8mb4; set character_set_connection = utf8mb4; set character_set_database = utf8mb4; set character_set_results = utf8mb4; set character_set_server = utf8mb4; |
将已经生成的表也转成utf8mb4
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; |
小记:直接在这个层面上解决,省了在代码中转和处理方便很多.
CentOS6.5安装配置postfix邮件系统 启用并配置SMTP虚拟账户
星期三, 三月 9th, 2016 | JAVA-and-J2EE, linux, php | 一条评论
CentOS6.5_64位系统下安装配置postfix邮件系统 启用并配置SMTP虚拟账户 实录
开启用户注册的邮件检验功能,需要发送邮件,使用其他服务商的邮件服务总有每日和发送间隔发送邮件限制.
废话不多说主要实现功能为设置postfix配置,启用smtp服务帐号,只用来发送邮件验证和newsletter邮件
一:配置postfix及简单简介
开始之前,先介绍几个枯燥的名词:
MUA:用户代理端,即用户使用的写信、收信客户端软件。比如:outlook、foxmail等客户端软件,乃至通过浏览器登录邮箱并发送邮件的BS架构网页也算是MUA。
MTA:邮件传送端,即常说的邮件服务器,用于转发、收取用户邮件。本文之中的postfix实现的就是MTA,当然postfix也是一种特殊的MUA,不再深入介绍,本文之中仅把postfix当做MTA使用。
MDA:邮件代理端,相当于MUA和MTA的中间人,可用于过滤垃圾邮件。
POP:邮局协议,当前是第三版,也就是POP3,用于MUA连接服务器收取用户邮件,通信端口110。
IMAP:互联网应用协议,功能与POP类似:也用于MUA连接服务器收取用户邮件;功能较POP多,通信端口143。
SMTP:简单邮件传送协议,MUA连接MTA或MTA连接MTA发送邮件使用此协议,通信端口25,启用ssl/tls的情况下端口为465或587。
一般发邮件的步骤流程是:
1、MUA通过POP、IMAP或SMTP协议连接MTA(称之为mta1);本文之中php通过phpmailer请求发送邮件的php脚本就扮演了MUA的角色,而postfix就是MTA;
2、MUA发送邮件给mta1(或者说MUA通过mta1发送邮件);本文中postfix就是这个mta1;
3、mta1与其他的MTA自主沟通连接将邮件传送至指定域下的指定用户(此时mta1就扮演了MUA的角色功能,这种交互是由邮件系统软件自主实现,与用户端无关)。
本次搭建postfix目的很明确:
› Continue reading
Base64.encodeBase64String换行回车解决方法
星期四, 二月 18th, 2016 | JAVA-and-J2EE | 没有评论
在做接口对接的时候老是报签名错误,一步一步跟踪到原来是Base64出的问题,记录下:
据RFC 822规定,每76个字符,还需要加上一个回车换行
就因为这些换行弄得出了问题,解决办法如下,替换所有换行和回车
1 2 3 4 5 | private static String base64(String str, String charset) throws UnsupportedEncodingException { String encoded = Base64.encodeBase64String(str.getBytes(charset)); encoded = encoded.replaceAll("[\\s*\t\n\r]", ""); return encoded; } |
小计:在php环境下不存在此问题
1 2 3 4 5 6 7 8 9 | /** * 电商Sign签名生成 * @param data 内容 * @param appkey Appkey * @return DataSign签名 */ function encrypt($data, $appkey) { return urlencode(base64_encode(md5($data.$appkey))); } |
jira 6.3.6 汉化的官方语言包版本
星期六, 十月 17th, 2015 | JAVA-and-J2EE, linux | 没有评论
在网上找对应的汉化包的时候,清一色给的是 JIRA-6.3.3-language-pack-zh_CN.jar,这个jar包
这个在安装的时候使用是可以的,等完成后运行一段时间 发现此插件过期,无法使用又退回到英文版本.
无奈之下看了想看下此插件包的对应的开发步骤时候,无意中发现 了官方的各个语言版本包可以直接下载
需要对应的语言包可以点击 https://translations.atlassian.com/,
TimerTask之spring静态注入
星期三, 七月 1st, 2015 | JAVA-and-J2EE | 没有评论
是用jdk自带的TimerTask做简单任务处理感觉蛮简单;
遇到spring无法注入的情况,具体表现:
@Resource annotation is not supported on static fields
1.第一次启动的时候对应的dao是可以注入进来的
2.中间执行run方法的时候dao则为NULL
解决 再引入一个静态初始化的时候转换即可:
@Resource private BookDao bookDao; private static BookDao bkDao; public void start() { bkDao= this.bookDao; if (!start) { VisitStatServiceUtil daemon = new VisitStatServiceUtil(); click_timer = new Timer("VisitStatServiceUtil", true); click_timer.schedule(daemon, INTERVAL, INTERVAL);// 运行间隔1分钟 start = true; } log.info("VisitStatService started."); } |
注:在用xml配置的时候 可以通过get set 启用生效;(在项目去 DAO和Service的xml配置文件引发的一系列问题,逐个击破,达到切换到注解模式下)
阿里云香港主机恢复小记
星期日, 六月 21st, 2015 | JAVA-and-J2EE, linux | 没有评论
阿里云香港主机服务停止了算是有一天的时间,具体什么时候开始的就不清楚了
只知道大概下午2点左右的时候收到的短信通知,一直到晚上23点的时候才真正恢复
服务器才可以登录,具体服务的影响还要去启动服务器,我以前做了自动启动但还是有影响
其中的软链接 失效了,记录下
对应的启动信息:
1.error while loading shared libraries:libmysqlclient.so.18
重新做下软链接
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64
› Continue reading
大型在线阅读网站的技术拆迁
星期日, 六月 21st, 2015 | JAVA-and-J2EE, 读书 | 一条评论
在原有的系统上抽离出新新的系统,重新设计能避免原来系统的种种问题,事实上哪有那多的重新演化,推倒重来也会遇到各种问题;
逐步迭代,逐步更新更来的实际废话不多了,想在线看书可以移步这里 爱阅读
遇到的问题(要分表分库无规律可循):
1.在线阅读书籍的数量越来越多,章节单表存储遭遇上限(记录几百万查询速度变慢)
2.章节的id是UUID 没有按照书籍信息进行编码拆分,即无法和书籍关联起来
解决方法:
1.设计和书籍绑定id,此问题不存在,直接分表分库
2.既然原来的不能动,那就加中间层,来次中间rehash 重新转换,完全解耦
以前的开发模式和流程完全不变,只需要中间层拆分数据层即可
小结:中间层的增加,直观上直接增加了程序的执行时间,但是可以支持无限扩展模式;
遇到问题解决问题才是王道,让合适的事情在合适的地方去拆解,没有那么多重新设计和开发
在看开源的代码、系统架构和其他别人的系统的时候,多去想想为什么,有时候看似有点多余的设计,也是有实际情况的限制
在软件行业快速发展的今天,貌似我们遇到的问题,90%都已经被别人遇到,没有那么多不可能,多的是自己实力不到
10%的问题的解决方案你能遇到并解决之,岂不快哉,探索的世界永远值得探索,保持对未知事情的兴趣.
java捕获kill信号来处理程序信息
星期五, 五月 29th, 2015 | JAVA-and-J2EE, linux | 一条评论
在c中常要控制对应的信号信息,在java中也可以实现简单的信号捕获;
可以作为程序的关闭时候清理数据做参考,
程序如下:
› Continue reading
双hash减少用户名冲突JAVA版
星期五, 五月 8th, 2015 | JAVA-and-J2EE, 游戏开发 | 没有评论
游戏中要去校验用户名是否重复,redis中放中文的key貌似蛮怪的吧,还是hash后放数字吧,从而校验是否冲突;
hash冲突 例如“Af”和“BG”哈希值相同,则有“AfAf”,“AfBG”,“BGAf”,“BGBG”的哈希值也相同
具体关于java的Hash冲突攻击 可以参考此文章:http://keary.cn/?p=845
不废话了,实际双hash用途很多,还有就是java中的自带hash会出现负数比如 (-8%3) 就为-2 依赖取模后的值就会出问题;
上代码:
› Continue reading
Lucene查询速度慢的简单优化
星期一, 四月 27th, 2015 | JAVA-and-J2EE | 没有评论
算不上比较高深的优化,只是增加了内存就效果明显,表现原因
1.数据量在100W,索引的文件大小90M,算是比较小的了,查询下来需要1000ms
让我很是不解,在本地测试的时候都未出现此情况,只有第一次初始查询出现超过1000ms,
无法接受的速度
2.查看内存使用情况,发现可用内存太少所致,每次都要重新缓存索引,gc内存,(我压榨了阿里云的最大使用率),升级内存,重启OK,速度终于在10ms
3.使用了FSDirectory,使用RAMDirectory效果不明显,而且占用不少内存(实在没有必要)
小结:服务器的性能还没有本地开发机性能好的时候,只有尽快优化了,既要降低cpu的使用率,又不能大量占用内存,真是愁啥人啊
Search
相关文章
热门文章
最新文章
文章分类
- ajax (10)
- algorithm-learn (3)
- Android (6)
- as (3)
- computer (86)
- Database (30)
- disucz (4)
- enterprise (1)
- erlang (2)
- flash (5)
- golang (3)
- html5 (18)
- ios (4)
- JAVA-and-J2EE (186)
- linux (144)
- mac (10)
- movie-music (11)
- pagemaker (36)
- php (50)
- spring-boot (2)
- Synology群晖 (2)
- Uncategorized (6)
- unity (1)
- webgame (15)
- wordpress (33)
- work-other (2)
- 低代码 (1)
- 体味生活 (40)
- 前端 (21)
- 大数据 (8)
- 游戏开发 (9)
- 爱上海 (19)
- 读书 (4)
- 软件 (3)