从 #5526 拆出的止血单(其路线 C)。根因 —— values: string[] 往返编码对非字符串类型有损,路线 A(tagged 编码)/ B(内部表示改 unknown[])—— 在 #5526 等维护者拍板;本单不裁根因,只挡住已实测的真实业务形状(零填充订单号 / SKU / 邮编、带尾零的价格串)。
位置
packages/services/service-analytics/src/strategies/filter-normalizer.ts:recoverNumber 的正则 /^-?\d+(\.\d+)?$/ 及其在 coerceFilterValueForSql / coerceFilterValueForObjectQL 中的消费。
改法
仅当字符串是规范数字形(String(Number(s)) === s)才还原为数字:
验收
Blocked-by: https://github.com/objectstack-ai/objectstack/pull/5525(同文件 filter-normalizer.ts,按同文件串行规则先等它落地)
Part of #5526
从 #5526 拆出的止血单(其路线 C)。根因 ——
values: string[]往返编码对非字符串类型有损,路线 A(tagged 编码)/ B(内部表示改unknown[])—— 在 #5526 等维护者拍板;本单不裁根因,只挡住已实测的真实业务形状(零填充订单号 / SKU / 邮编、带尾零的价格串)。位置
packages/services/service-analytics/src/strategies/filter-normalizer.ts:recoverNumber的正则/^-?\d+(\.\d+)?$/及其在coerceFilterValueForSql/coerceFilterValueForObjectQL中的消费。改法
仅当字符串是规范数字形(
String(Number(s)) === s)才还原为数字:'7'→7、'1.5'→1.5(真数字往返不回退);'007'、'0912'、'1.50'保持字符串(它们保留了Number()往返会丢失的原写法信息,只可能是作者笔下的字符串);'null'/'true'/'false'的 token 撞车不在本单(那是编码层面的根因,analytics 的string[]值往返对字符串比较数也有损:{code: {$eq: '007'}}绑成数字7、'null'绑成真 NULL、'true'绑成1—— 文本列静默取到错行 #5526 裁)。验收
string[]值往返对字符串比较数也有损:{code: {$eq: '007'}}绑成数字7、'null'绑成真 NULL、'true'绑成1—— 文本列静默取到错行 #5526 实测表:{code: {$eq: '007'}}两条路径(SQL 绑定 + 引擎比较数)都绑'007'字符串;'1.50'同理;'007'的行能被{$eq: '007'}取到(现状零行);{$eq: 7}经 stringify →'7')行为不变;Blocked-by: https://github.com/objectstack-ai/objectstack/pull/5525(同文件
filter-normalizer.ts,按同文件串行规则先等它落地)Part of #5526