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)