如何在Postgres/Prisma中查询含运算符符号的字符串?
解决Postgres中查询含
+字符的编程语言名称问题 问题原因
你遇到的问题核心是URL查询参数的解析规则:当用户输入c+或c++作为查询条件时,浏览器会把+编码为URL中的空格符号,request.nextUrl.searchParams.get('q')拿到的实际值是c 或c (带空格),而非原始的c+/c++。用这个带空格的参数做ILIKE查询,自然匹配不到数据库里的C++、C#这类名称。
补充说明:Postgres的ILIKE本身不会把+当作通配符(通配符只有%和_),所以只要参数正确传递,就能正常匹配目标数据。
解决方案
1. 还原URL参数中的+字符
把searchParams.get()返回结果里的空格转回+,确保拿到原始查询内容:
const params = request.nextUrl.searchParams.get('q')?.replace(/ /g, '+') || ''; const query = `%${params}%`; const langs = await prisma.$queryRaw` SELECT lang FROM "ProgrammingLanguages" WHERE lang ILIKE ${query} ORDER BY LENGTH(lang) ASC;`;
2. (可选)处理LIKE通配符转义
如果后续需要支持查询含%、_这类LIKE特殊字符的名称,还需要对参数进行转义,并指定转义符:
// 转义LIKE的特殊字符:%、_、\ const escapeLikePattern = (str) => str.replace(/([%_\\])/g, '\\$1'); // 先还原+,再转义通配符 const rawParam = request.nextUrl.searchParams.get('q')?.replace(/ /g, '+') || ''; const query = `%${escapeLikePattern(rawParam)}%`; const langs = await prisma.$queryRaw` SELECT lang FROM "ProgrammingLanguages" WHERE lang ILIKE ${query} ESCAPE '\\' ORDER BY LENGTH(lang) ASC;`;
验证
修改后再查询c++时,参数会被正确还原为c++,ILIKE %c++%就能匹配到数据库中的C++等相关条目。
内容的提问来源于stack exchange,提问作者nobunaga
相关产品推荐
相关产品推荐

