昨天最近在入库数据的时候,发现mysql在同一数据库下有两张表,用网站搜索内容的时候,只能出现一张表的结果(两张表里有同样的内容,正常可以搜索出来的)但是在MySQL命令行下检索就正常。


刚开始认为是编码、字段名、索引、导出的文件去除了BOM头(签名)等的错误,用Navicat查看测试,结果都排除了,奇怪!!!


又怀疑是不是入库时文本文件头有“杂乱”数据,在这个库上用TXT导出,在入库还是不行。又导出SQL脚本,在入库还是不行。更奇怪了!!!


百度、群里询问无果,一头雾水的一天过去。


今天,在反复测试的时候,无意间发现导出的TXT导入回去有问题,导出的SQL脚本,把SQL里的脚本语句删除,只留数据和TXT的文本一样时,导入数据后,数据就突然正常。


原因一:

返回值数量不匹配。如网站需要返回user,pasword,email三个值,但是你数据库只有user,email两个值,那就不能正确的返回。


原因二:

那会会是有问题数据连软件都没发现呢?

这是我觉得用十六进制去查看下到底有什么,用WinHex打开文件后,果然发现问题,红色箭头处。


经过分析,数据在第一次入库时候已经把BOM头入库了,之后你不管怎么导出,始终是有那个BOM头信息的,因为它在数据区,而正常的BOM在头部区,而文本编辑软件如“EmEditor”只会判断头部区是否有BOM,而不会判断数据区,所以软件在另存的时候没有发现这个问题。导致你怎么弄都会携带BOM头,而且入库时被当成数据入库,就造成数据检索问题。


wKioL1fJRbKQyHfIAAF3dGOTzfc020.jpg


那为什么导出的SQL就能正常呢?

因为他导出时候在数据区,而且BOM头前后都有正常的SQL语句,在SQL转成TXT时,“无意”中就把BOM头给删除了,所以后来导入就正常了。



这是MySQL数据库文件。

wKioL1fJRbPAxoteAAEurzwU1jY109.jpg


这是要入库的文件,一个是入库后表有问题,一个是入库后表能正常使用的。

wKiom1fJRbShRxXMAAE7PB4B2Ys657.jpg