MariaDB中SELECT语句WHERE子句数据匹配异常排查求助
排查MariaDB中username字段精确匹配失败的问题
检查字段末尾的不可见字符
执行以下SQL,对比字符的字节长度、字符长度,同时查看十六进制编码:SELECT username, LENGTH(username), CHAR_LENGTH(username), HEX(username) FROM your_table WHERE CONVERT(username USING ASCII) = 'any-user-test';正常的
any-user-test十六进制为616E792D757365722D74657374。如果结果中LENGTH和CHAR_LENGTH数值不同,或者HEX编码末尾多了20(空格)、09(制表符)、0D(回车)、0A(换行)等额外值,说明字段值包含不可见的非ASCII字符。验证字符集与排序规则一致性
先检查表结构,确认username字段的字符集和排序规则:SHOW CREATE TABLE your_table;确保字段的字符集为
utf8mb4、排序规则为utf8mb4_unicode_ci。同时,强制指定查询字符串的字符集,排除连接字符集不匹配的问题:SELECT * FROM your_table WHERE username = _utf8mb4'any-user-test';排查Unicode等效字符差异
有些字符视觉上一致,但Unicode编码不同(比如普通连字符U+002D和非断连字符U+2010),utf8mb4_unicode_ci的排序规则可能不会将它们视为完全相等,导致精确匹配失败。通过对比HEX(username)和HEX('any-user-test')的完整十六进制编码,确认每个字符的编码完全一致。确认加密逻辑的影响
如果数据库启用的是透明存储加密,通常不会影响字符匹配;如果是字段级自定义加密,检查加密/解密过程是否引入了额外字符,或者在字符集转换环节出现异常,导致存储的实际值和视觉上的any-user-test存在差异。
内容的提问来源于stack exchange,提问作者Carlos Ramírez
相关产品推荐
相关产品推荐

