MySQL含§符号的LIKE查询在Linux环境失效的解决方法
解决Linux环境MariaDB中LIKE查询无结果的问题
嗨,这种跨平台的LIKE匹配差异我之前也碰到过,大概率是**字符集/排序规则(Collation)**在Windows和Linux环境下的默认配置不一样导致的——毕竟MariaDB在不同系统上的默认规则经常有区别。给你几个具体的排查和解决方向:
先排查字符集与排序规则差异
首先分别在Windows和Linux的MariaDB中执行以下命令,对比数据库和表的字符集配置:- 查看数据库级配置:
SHOW CREATE DATABASE your_database_name; - 查看表级配置:
SHOW CREATE TABLE holidays;
重点关注COLLATE字段,Windows环境可能使用了utf8mb4_general_ci或带_ci_win后缀的排序规则,而Linux环境可能默认用了utf8mb4_bin或对特殊字符区分更严格的规则,这会直接导致§这类特殊字符的匹配行为不一致。
- 查看数据库级配置:
在查询中显式指定排序规则
如果确认是排序规则的问题,可以直接在查询语句中强制指定和Windows环境一致的排序规则,让Linux上的匹配逻辑对齐:SELECT * FROM holidays WHERE name LIKE '% (§)' COLLATE utf8mb4_general_ci;注意替换成你Windows环境实际使用的排序规则(比如如果是
utf8_general_ci就改成对应的值)。检查客户端连接的字符集设置
有时候客户端连接时的字符集参数和数据库不一致也会引发这类问题。在两个环境的MySQL客户端中执行以下命令对比输出:SHOW VARIABLES LIKE '%character_set%'; SHOW VARIABLES LIKE '%collation%';重点确保
character_set_client、character_set_connection、collation_connection这些参数在两个环境中一致。如果不一致,可以在Linux客户端连接时指定字符集,比如:mysql --default-character-set=utf8mb4 -u your_username -p兜底方案:二进制匹配
如果上面的方法都没解决问题,可以尝试用二进制匹配绕开排序规则的影响,直接对比字符的二进制存储内容:SELECT * FROM holidays WHERE BINARY name LIKE BINARY '% (§)';不过这个方法会严格匹配字节,需要确保两个环境中
§字符的存储编码完全一致(比如都是UTF-8的C2 A7字节)。
内容的提问来源于stack exchange,提问作者S. Tea
相关产品推荐
相关产品推荐

