MariaDB:where firstname='André':返回firstname=André且firstname=Andre的行

MariaDB:where firstname='André':返回firstname=André且firstname=Andre的行,mariadb,Mariadb,我的问题是,使用select语句返回的行太多。我限制where部分,但是如果列中的值包含特殊字符,MariaDB将忽略比较 在下面的示例中,我在一个表中插入了两行 行包含André-此名称的最后一个字符是éU+00E9。 行包含Andre-此名称的最后一个字符是EU+0065。 创建表`name\u test``firstname`varchar40 ENGINE=InnoDB AUTO\u INCREMENT=48531 DEFAULT CHARSET=utf8mb4; 在name_test

我的问题是,使用select语句返回的行太多。我限制where部分,但是如果列中的值包含特殊字符,MariaDB将忽略比较

在下面的示例中,我在一个表中插入了两行

行包含André-此名称的最后一个字符是éU+00E9。 行包含Andre-此名称的最后一个字符是EU+0065。 创建表`name\u test``firstname`varchar40 ENGINE=InnoDB AUTO\u INCREMENT=48531 DEFAULT CHARSET=utf8mb4; 在name_test firstname值中插入'André'; 在name_test firstname值中插入'Andre'; 选择*from name_test,其中firstname='André'; 名字 ========= 安德烈 安德烈 选择*from name_test,其中firstname='Andre'; 名字 ========= 安德烈 安德烈 显示会话变量,如“字符集%”; 变量名称值 ========================== ===== 字符集客户端utf8 字符集连接utf8 字符集数据库utf8mb4 字符集文件系统二进制 字符集结果utf8 字符集服务器utf8mb4 字符集系统utf8 字符集目录/usr/share/mysql/charsets/ 选择“安德烈”=“安德烈”; “安德烈”=“安德烈” =================== 1. 设置排序规则\u连接=utf8mb4\u bin; 选择“安德烈”=“安德烈”; “安德烈”=“安德烈” =================== 0 选择*from name_test,其中firstname='André'; 名字 ========= 安德烈 安德烈 显示会话变量,其中变量名称如“version%”; 变量名称值 =========================== ================================ 版本10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04版本 版本编译机器x86 64 版本编译操作系统debian linux gnu 版本\u malloc\u库捆绑jemalloc 为什么select语句返回两行而不是一行


是否存在除=?

以外的比较运算符取决于字符集/排序规则,重音字符是否与非重音字符相同

更改排序规则连接值没有帮助,因为您的列有自己的排序规则,排序规则优先级更高

您可以更改列的排序规则或使用COLLATE:


也许选择不同的?也许。。但我选择了安德烈,我得到了安德烈和安德烈。Andre不等于André从name_测试中选择不同的firstname,其中firstname='André';->返回André,从name_测试中选择distinct firstname,其中firstname='Andre';->安德烈也回来了。对于多个quals结果,distinct始终返回一行。但是André和Andre并不相等,最好是改变列的排序规则——如果你总是想要相同的效果的话。
select * from name_test where firstname collate utf8mb4_bin = 'André' ;