mysql 索引超出范围_参数索引超出范围(已解决)

在Java代码中执行SQL查询时遇到ActiveRecordException,原因是参数索引超出范围。错误发生在设置纬度和经度参数时。SQL查询涉及根据距离排序的店铺检索。排查并修复了导致此错误的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java代码:

public Page queryReserveStore(User user,int pageNo) {

Kv kv = Kv.by("lattitude", user.getLatitude()).set("longitude", user.getLongitude());

return paginate(pageNo, Global.pageSize, getSqlPara("user.queryReserveStore",kv));

}

sql代码:

#sql("queryReserveStore")

SELECT id,store_name,province,city,area,address,

ROUND(6378.138*2*ASIN(SQRT(POW(SIN((#para(lattitude)*PI()/180-latitude*PI()/180)/2),2)+

COS(#para(lattitude)*PI()/180)*COS(latitude*PI()/180)*POW(SIN((#para(longitude)*PI()/180-longitude*PI()/180)/2),2)))*1000)

AS juli

FROM y_reserve_store WHERE is_publish = 1 AND del_flag = 0 ORDER BY juli Asc

#end

错误提示:

com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

at com.jfinal.plugin.activerecord.Model.doPaginate(Model.java:342)

at com.jfinal.plugin.activerecord.Model.paginate(Model.java:982)

at com.mibo.modules.data.model.ReserveStore.queryReserveStore(ReserveStore.java:20)

at com.mibo.modules.app.service.UserService.store(UserService.java:1210)

at com.mibo.modules.app.action.UserAction.store(UserAction.java:442)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at com.jfinal.aop.Invocation.invoke(Invocation.java:73)

at com.mibo.common.interceptor.UserTokenInterceptor.intercept(UserTokenInterceptor.java:38)

at com.jfinal.aop.Invocation.invoke(Invocation.java:67)

at com.mibo.common.interceptor.ErrorInterceptor.intercept(ErrorInterceptor.java:15)

at com.jfinal.aop.Invocation.invoke(Invocation.java:67)

at com.jfinal.core.ActionHandler.handle(ActionHandler.java:83)

at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:48)

at com.mibo.common.handler.NotFoundHandler.handle(NotFoundHandler.java:34)

at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:73)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)

Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)

at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3319)

at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3304)

at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3341)

at com.mysql.jdbc.PreparedStatement.setDouble(PreparedStatement.java:3257)

at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3533)

at com.mysql.jdbc.JDBC42PreparedStatement.setObject(JDBC42PreparedStatement.java:68)

at com.alibaba.druid.pool.DruidPooledPreparedStatement.setObject(DruidPooledPreparedStatement.java:481)

at com.jfinal.plugin.activerecord.dialect.Dialect.fillStatement(Dialect.java:226)

at com.jfinal.plugin.activerecord.DbPro.query(DbPro.java:79)

at com.jfinal.plugin.activerecord.Db.query(Db.java:70)

at com.jfinal.plugin.activerecord.Model.doPaginateByFullSql(Model.java:356)

at com.jfinal.plugin.activerecord.Model.doPaginate(Model.java:340)

... 34 more

### MySQL 中 `utf8mb4` 字符集使用说明 #### 一、字符集定义与适用范围 MySQL自5.5.3版本起引入了`utf8mb4`字符集,该字符集能够兼容四字节Unicode字符[^2]。这意味着对于那些超出传统UTF-8所能表示的最大三字节范围之外的特殊符号——比如表情符号(Emoji)、某些罕见汉字以及其他新加入到Unicode标准里的字符——都可以被正确处理。 #### 二、配置设置指南 当决定采用`utf8mb4`作为数据库默认字符集时,需注意调整如下几个地方: 1. **服务器端全局变量** - 修改my.cnf文件中的character-set-server参数为`utf8mb4` 2. **客户端连接选项** - 设置相应的环境变量或者通过命令行指定--default-character-set=utf8mb4来确保每次建立新的会话都能识别并应用此字符集 3. **表结构设计层面** - 对于已经存在的数据表,在不影响业务逻辑的前提下考虑逐步迁移至支持更广泛字符集的新架构;新建表格则直接声明其字段使用的具体编码方式为`CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci` ```sql ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE new_table ( id INT NOT NULL AUTO_INCREMENT, content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, PRIMARY KEY (id) ); ``` #### 三、性能考量因素 尽管从长远来看升级到`utf8mb4`有助于提升系统的国际化能力,但在实际操作过程中可能会面临一定的挑战。由于每个字符占用的空间增加到了最多四个字节,这可能导致磁盘I/O效率下降以及内存消耗增大等问题。因此建议开发者们权衡利弊后再做决策,并密切关注转换前后系统的表现变化情况。 --- ### 关于 `utf8mb4` 和 `utf8` 的主要差异 两者间最显著的不同在于所支持的字符种类及其对应的字节数量上限。传统的`utf8`(实际上是指`utf8mb3`)仅限于表达不超过三个字节长度的标准Unicode字符集合内的成员,而`utf8mb4`则进一步扩展了这一界限,允许存储多达四个连续字节构成的数据单元,从而实现了对整个Unicode字符集的支持[^4]。 此外值得注意的是,虽然官方文档指出`utf8mb4`是`utf8`的一个超集并且理论上不应该影响已有数据的正常显示和访问,但是在实践中仍有可能遇到诸如索引大小受限或是特定场景下的表现问题等情况发生。所以在实施大规模变更之前最好先进行全面测试验证方案可行性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值