【工作问题】Mysql数据库隐形不显示空格导致的BUG
今天工作中需批量导入手机号码等数据,写了个判断手机号码String.length()
不为11位的写入到错误文件中。过程还算顺利,大部分号码是对的,但是结果中出现两个我"确定"为11位的手机号码"158XXXX8403",无论是Mysql数据库中还是idea,点击复制都是妥妥的"11"位,前后确定没有空格!真是百思不得其解。
然后写了个System.out.println("手机号".length())
,看看这个号码测出来不是11位是多少位?
结果打印出来12位。
%()&&@#@#什么鬼啊,我当时觉得我是眼睛花了吗,手机号码多少位都数不清楚了?
不信邪的我然后直接把数据库里的这个号码复制出来到idea想再数数到底多少位,结果奇怪的事情就发生了:
等等,这个手机后面的**\u202C**是什么鬼?我非常确定数据库这个字段是没有后面的东西的,于是我上网一搜,有同学遇到了同样的问题:
unicode编码导致的问题:从excel或wps表格直接复制到数据库中,然后保存。
会有可能出现**"\u202d136xxxxx16\u202c", “159xxxxx67”,"\u202d136xxxxx31"**这样的附加"奖励",且复制粘贴是根本看不出来任何问题的。
猜测
至于为什么idea能把隐形的\u202C
显示出来,我猜是因为我的idea用的GBK编码,而GBK编码里没有\u202C
,也就是Unicode里\u202C
这个表示隐形空格的编码在GBK里是没有正确表示的,因此GBK只能将\u202C
原型毕露。
而Mysql的不管是UTF-8mb64还是UTF-8都是在Unicode基础之上定义的。根据Unicode中字符的编码位置,能找到对应的utf-8编码,所以UTF-8也就是MySQL可以正确"显示"这个隐形空格(差点怀疑人生)。。。