Mysql 在sqlalchemy中,如何强制筛选器()匹配精确的大小写(区分大小写)?

Mysql 在sqlalchemy中,如何强制筛选器()匹配精确的大小写(区分大小写)?,mysql,filter,sqlalchemy,case-sensitive,Mysql,Filter,Sqlalchemy,Case Sensitive,我正在mysql数据库中使用sqlalchemy。当我对用户对象使用以下查询时: session.query(User).filter(User.name == 'admin').all() 我得到所有的结果,其中usename为'Admin','Admin','Admin'(基本上都不区分大小写'Admin')。我想知道如何强制筛选器()过滤精确匹配(而不忽略大小写) 更新:事实上,我刚刚知道mysql不允许varchar()数据类型使用区分大小写的列。因此,最简单的解决方案是在mysql中

我正在mysql数据库中使用sqlalchemy。当我对用户对象使用以下查询时:

session.query(User).filter(User.name == 'admin').all()
我得到所有的结果,其中usename为'Admin','Admin','Admin'(基本上都不区分大小写'Admin')。我想知道如何强制筛选器()过滤精确匹配(而不忽略大小写)

更新:事实上,我刚刚知道mysql不允许varchar()数据类型使用区分大小写的列。因此,最简单的解决方案是在mysql中声明时强制列区分大小写,如下所示:

  `name` VARCHAR(255) BINARY NULL UNIQUE,

但我仍然想知道如何强制过滤器精确匹配结果(不忽略案例)。是否使用了一些内置的(或自定义的,如果可能的话)sqlalchemy函数?

通常,sqlalchemy所做的是用表达式构造一个SQL字符串查询。自由键入上述表达式将产生如下结果:

SELECT user.* FROM user WHERE user.name = 'admin'
当然,
user.*
将替换为所有
user
列的显式枚举

问题在于,它取决于这个查询返回的内容:如果它不敏感地比较大小写,那么SQLAlchemy就无能为力。从我收集的资料来看,您可以使用
WHERE BINARY user.name='admin'
显式构造查询。然而,我不知道SQLAlchemy的等价物,所以您可能需要在这里构建一个文本字符串


无论如何,我建议您在SQLAlchemy列表中询问特定的解决方案(特别是,我认为了解一种将
二进制
集成到
WHERE
查询的方法会很有趣)。

不知道MySQL,但为什么不试试
cast
呢。我不确定SA对MySQL的支持程度:
session.query(User).filter(cast(User.name,VARCHAR(255,binary=True))==“admin”).all()
great!!但是你怎么知道的?我在SQLAlchemy网站上找不到有关“func”的任何信息:(func允许您将特定于数据库的函数传递到查询中。我相信这样做会失去ORM的某些用途,因为调用类似func的函数。count()可能无法移植到所有数据库引擎。
来自SQLAlchemy.sql import func
更多信息,请参见:
select * from users where binary name = 'AdMin';
select * from users where binary name = 'admin';


from sqlalchemy import func
User.query.filter(User.name == func.binary('AdMin')).count()
User.query.filter(User.name == func.binary('admin')).count()