MySql查询 值存在但查不到
MySql查询 值存在但查不到
- 问题描述
- 解决问题
- 验证问题
- 处理问题
问题描述
今天遇到一个很奇怪的问题,发现sql在按照一个sn
字段进行更新的时候,总是更新失败,查看程序日志发现更新个数总是0,但是对比数据,数据库中确实有这个数据,接下来根据数据进行查询,发现也是无法查询到
select * from table where sn = 'fsiqj';
解决问题
- 由于我是使用excel导入的数据,首先怀疑是否是excel单元格格式的问题,遂更换单元格格式为文本类型,再次查询,依旧查询不到
- 思考可能是由于字符编码问题导致的,查询资料
可能由于sn的末尾有一个额外的字符 ‘’,这是 Unicode 字符 U+FEFF 的表示(在 HTML/XML 中常被渲染为 ,但在字符串中它是一个实际的字符)。
这导致字符串长度变为 33 个字符(32 个原始字符 + 1 个 U+FEFF 字符)。
U+FEFF 是一个“零宽不折行空格”,在文本中通常不可见(尤其在图形界面中),但在数据库字符串比较时,它会被视为有效字符,因此会影响匹配结果。
字符集和编码的影响: 如果数据库使用 UTF-8 编码,U+FEFF 会被编码为字节序列 EF BB BF。但在字符串比较中,它被视为一个字符。如果您的数据库或客户端工具(如 SQL 客户端)在复制粘贴值时不小心引入了这个字符(常见于从网页、文本编辑器或导出数据中复制时),就会导致这种问题。
验证问题
我的mysql是utf-8的编码
通过sql语句查询这个值的长度和16进制字符
SELECT LENGTH("") AS length,HEX("") AS hex_representation;
结果显示这个值的长度确实比我自己手写输入的值 多了3
16进制文本输出的末尾也有 EFBBBF
处理问题
这个问题是我导入数据的时候的数据问题,导致存储的数据出现的问题,因此对数据库数据进行了清理,若是其他地方的数据问题,可根据具体情况解决
-- 仅去除末尾的 EFBBBF
UPDATE table
SET sn = CASE WHEN RIGHT(HEX(sn), 6) = 'EFBBBF'THEN UNHEX(LEFT(HEX(sn), LENGTH(HEX(sn)) - 6))ELSE snEND
WHERE HEX(sn) LIKE '%EFBBBF';
The End.