You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vertx SQL客户端LIKE运算符参数数据类型错误及无结果问题求助

解决Vertx MySQL/PostgreSQL客户端LIKE查询的参数问题

嘿,我正好碰到过类似的坑,给你捋清楚问题出在哪,再给你靠谱的解决方案!

首先说你两次尝试的问题:

  1. 第一次的写法"select * from users where username like '%?%'":这里的?被包裹在单引号里了,数据库会把'%?%'当成一个完整的字符串常量,根本不会把?识别为参数占位符,所以它不知道$1对应的参数类型,自然报错。
  2. 第二次的写法jsonArrayOf("'%$query%'"):你给参数加了额外的单引号,比如如果query是"alice",实际传给数据库的参数是"'%alice%'"(连带着单引号),数据库会去匹配用户名里包含单引号和alice的记录,而不是你想要的“包含alice的用户名”,所以没返回预期结果。

正确的解决方案有两种,都能避免问题还安全:

方案1:在SQL里用CONCAT拼接通配符

直接让数据库帮你把%和参数拼起来,参数就传原始的查询字符串就行:

val result = connection.queryWithParamsAwait(
    "select * from users where username like CONCAT('%', ?, '%')",
    jsonArrayOf(query)
)

这种方式的好处是逻辑完全在SQL层面,参数由驱动安全处理,彻底避免SQL注入风险,不管是MySQL还是PostgreSQL都支持CONCAT函数。

方案2:在代码里给查询字符串加%(不要加单引号)

如果你更习惯在代码里处理通配符,直接把%和query拼接成一个字符串,作为参数传入,注意不要加单引号:

val result = connection.queryWithParamsAwait(
    "select * from users where username like ?",
    jsonArrayOf("%$query%")
)

这里驱动会把"%alice%"作为一个完整的字符串参数传给数据库,数据库会正确识别为LIKE的匹配模式,不会把%当成SQL语法的一部分,同样安全。

重要提醒

千万别直接把查询字符串拼进SQL语句里(比如"select * from users where username like '%$query%'"),这种写法会引入严重的SQL注入风险,Vertx提供的参数化查询就是用来解决这个问题的,一定要用占位符?来传递参数!

内容的提问来源于stack exchange,提问作者Héctor Valls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:12:43