hibernate 从服务器收到的字段的未知字符集索引

jgzswidk  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(145)

我有一个MySQL 5.0.4.1的示例,其中有一个用Hibernate编写的应用程序。在其中一个页面上,我在服务器日志中收到以下错误消息:
从服务器收到的字段‘123’的未知字符集索引。
在com.mysql.jdbc.Connection.getCharsetNameForIndex(Connection.java:1664)
在com.mysql.jdbc.Field.(Field.Java:144)
在com.mysql.jdbc.MysqlIO.unpackField(MysqlIO.java:506)
在com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:280)
在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1319)
在com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1218)
在com.mysql.jdbc.Connection.execSQL(Connection.java:2233)
在com.mysql.jdbc.Connection.execSQL(Connection.java:2193)
在com.mysql.jdbc.Connection.execSQL(Connection.java:2174)
在com.mysql.jdbc.Connection.setAutoCommit(Connection.java:536)
在org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:268)
在org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:293)
在org.hibernate.transaction.JDBCTransaction.toggleAutoCommit(JDBCTransaction.java:194)
在org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:186)
在org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:162)
在org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:603)
在org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:579)
在org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:556)
在org.springframework.transaction.interceptor.TransactionAspectSupport.doCloseTransactionAfterThrowing(TransactionAspectSupport.java:284)
在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:100)
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
在org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:66)
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
在org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:66)
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
在$Proxy6.getDataFromDatabase(未知源)
在org.myCompany.myAction.Load(来源不明)
在sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法中)
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:324)
在org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
在org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
在org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
在org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
在org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
在org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
在javax.servlet.http.HttpServlet.service(HttpServlet.java:787)
在javax.servlet.http.HttpServlet.service(HttpServlet.java:908)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
在org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
在org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
在org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
在org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
在org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
在org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
在org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
在org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
在org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:217)
在org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
在org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:229)
在org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
在org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)

在org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:280)
在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:209)
在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
在com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.java:157)
在com.iplanet.ias.web.WebContainer.service(WebContainer.java:579)
这个错误发生在生产环境中,所以我不知道是哪个查询产生了这个问题,但我知道我的表中没有一个有名为‘123’的列。你对可能导致这个问题的原因有什么建议吗?

**编辑:**后续发现该行为为known bug in MySQL 5.0.4,但由于没有升级MySQL的选项,一直没有找到很好的解决办法。

xienkqul

xienkqul1#

可能是因为该字段的字符集被设置为无效值,在服务器上运行此SQL时出现替换表名的问题,列‘COLLATION’将显示每个varchar/char字段的字符集

SHOW FULL COLUMNS IN table_name;

然后,您可以使用以下命令更改字段的字符集:

ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET latin1;
7xzttuei

7xzttuei2#

在内部,MySQL正在跨列Map索引。通常这是使用表示列索引的整数来完成的。大多数索引实际上是构建后的复合索引(COL1+COL3),其形式类似于field 13
当堆栈不是完全相同的副本时,可能会在将数据从开发迁移到生产中时发生这种情况。
正如3urdoch提到的,您可以使用内部MySQL函数提取字符集;然后将表的字符集更改为兼容的编码。
或者(我打赌这个问题来自这里),您可以检查为Production加载的驱动程序是否与为Other服务器加载的驱动程序匹配。如果Development/Other服务器仍在测试,并迁移到Production,这将防止再次出现问题。

相关问题