Base64编码:挖坑及填坑

参考

base64编码踩坑之身份证号模糊查询
mysql中Base64编码与解码

使用场景

微信小程序需要将用户昵称存储到数据库中,但由于昵称中存在emoji表情。mysql需要修改编码格式(库,表,字段)才可以存储,嫌麻烦并不想在数据库已经建好的基础上再修改编码。所以就用Base64编码后存储,需要用的时候从数据库查询出来再进行解码。

	final Base64.Decoder decoder = Base64.getDecoder();
	final Base64.Encoder encoder = Base64.getEncoder();
	
	/**
	 * 对前台传过来的带有emoji的昵称进行编码
	 * @param emoji
	 * @return String
	 * @throws UnsupportedEncodingException
	 */
	public String emoji2String(String emoji) throws UnsupportedEncodingException{
		byte[] emojiByte = emoji.getBytes("UTF-8");
		return encoder.encodeToString(emojiByte);
	}
/**
	 * 将数据库查询出来的微信昵称进行解码成含有emoji的形式
	 * @param String
	 * @return emoji
	 */
	public String string2Emoji(String str) throws IllegalArgumentException{
		return new String(decoder.decode(str));
	}

挖坑

有个应用场景是需要对昵称进行模糊查询。要查询的对象是汉字,数据库中存的是编码后的字符串。
不能直接进行模糊查询。就有了以下的实验。

	// 测试编码
	@Test
	public void emoji2StringTest(){
		//String emoji = "🍋";
		//String emoji = "🎰🚣🛀🎫🏆⚽⚾🏀🏈🏉";
		//String emoji = "哈哈🍋";
		//String emoji = "お金持ち";
		//String emoji = "お金持ち🍋啊哈哈哈哈哈哈啊啊🍋啊啊啊啊啊啊啊🍋集聚地撒花饭店烧烤老🍋妇女都是积分ID管理费可爱";
		//String emoji = "12345678901234567890123456789012";
		String[] arr = {"最美一家人","不美一家人","最丑一家人","最美二家人","最美一国人","最美一家猪","最美","一家人"," "," 美一家人","最 一家人","最美 家人","最美一 人","最美一家 "};
		for(String emoji : arr){
			try {
				String result = emojiTranslate.emoji2String(emoji);
				System.out.println("编码结果:"+result);
			} catch (UnsupportedEncodingException e) {
				System.out.println("编码失败");
				e.printStackTrace();
			}
		}
	}

test结果
测试结果如上,乍看是有规律的。但是这个规律的明显程度还不足以让我去研究。何况测试还没加上emoji。所以,换个思路,科学求助。

填坑

参照最开始的链接里所讲的内容(可以点击查看详细,里面还有Base64的编码原理),使用mysql支持base64编码/解码的聚合函数,版本至少是5.6。

解码
SELECT * FROM familytab WHERE FROM_BASE64(familyName) LIKE '%🏀🏈🏉%';
编码
SELECT * FROM familytab WHERE TO_BASE64(familyName) LIKE '%一家人%';

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值