From 80b721b84fc85ddd91e479507998c65cf7524cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Thu, 10 Sep 2026 14:37:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(groups):=20=E5=AD=97=E8=8A=82=E5=BA=8F?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=8C=89=E6=96=B9=E8=A8=80=E2=80=94=E2=80=94?= =?UTF-8?q?MySQL=20CAST=20AS=20BINARY=20/=20SQLite=20COLLATE=20BINARY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit collate("BINARY") 被 SQLAlchemy 反引号成标识符致 MySQL 500;SQLite 的 CAST AS BINARY 语义不符(排序键失效退化 room_id 序,测试失去判别力)。 按 session.bind.dialect 分支,两库都用真字节序。 726 测试绿。 Co-Authored-By: Claude Code --- yunke-server/app/api/routers/groups.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/yunke-server/app/api/routers/groups.py b/yunke-server/app/api/routers/groups.py index 077487f..9d55ced 100644 --- a/yunke-server/app/api/routers/groups.py +++ b/yunke-server/app/api/routers/groups.py @@ -104,11 +104,20 @@ async def list_groups( if (channel or "wechat") == "wechat": # 云客「微信群统计」同款排序(2026-09-10 真机终判):owner_account_id # (=微信号/wxid 混存,如 Nancyjade < csf7169708 < wxid_01gv…——大写 - # 在小写前=区分大小写)**二进制字符串升序**分组,组内 room_id 字符串 - # 升序。COLLATE BINARY 双库通用(MySQL/SQLite)。WA 保持最近活跃优先。 + # 在小写前=区分大小写)**二进制字节序升序**分组,组内 room_id 字符串 + # 升序。字节序按方言:MySQL 用 CAST(col AS BINARY)(collate("BINARY") + # 会被 SQLAlchemy 反引号成标识符);SQLite 用 COLLATE BINARY(其 CAST + # AS BINARY 语义不符)。WA 保持最近活跃优先。 + dialect = session.bind.dialect.name if session.bind is not None else "" + if dialect == "mysql": + owner_order = sa.literal_column( + "CAST(chat_group.owner_account_id AS BINARY)" + ).asc() + else: + owner_order = ChatGroup.owner_account_id.collate("BINARY").asc() list_stmt = ( list_stmt.order_by( - ChatGroup.owner_account_id.collate("BINARY").asc(), + owner_order, ChatGroup.room_id.asc(), ) .limit(page_size)