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

Dav*_*vid 9 mysql hibernate

我有一个MySQL 5.0.4.1实例和一个用Hibernate编写的应用程序.在其中一个页面上,我在服务器日志中收到以下错误消息:

从服务器收到的字段"123"的未知字符集索引.
at com.mysql.jdbc.Connection.getCharsetNameForIndex(Connection.java:1664)
at com.mysql.jdbc.Field.(Field.java:144)
at 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.
org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:579)中的HibernateTransactionManager.doRollback(HibernateTransactionManager.java:603 )
在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)
的组织. 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)
at org.springframework.aop.framework.JdkDynamicAopProxy .invoke(JdkDynamicAopProxy.java:176)
在$ Proxy6.getDataFromDatabase(来源不明)
在org.myCompany.myAction.load(来源不明)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at 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 中的org.apache.struts.action.ActionServ.s. (ActionServlet.java:116)中的org.apache.struts.action.RequestProcessor.process
(RequestProcessor.java:224). struts.action.ActionServlet.doGet(ActionServlet.java:414)在javax.servlet.http.HttpServlet.service(HttpServlet.java:787)在javax.servlet.http.HttpServlet.service(HttpServlet.java:908)在组织.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)
at 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 $的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)
at 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"的列.您对可能导致此问题的原因有什么建议吗?

编辑:作为一个后续,我发现这个行为是MySQL 5.0.4中已知错误,但我没有找到一个好的wokaround,因为我没有升级mySQL的选项.

3ur*_*och 0

可能是由于某种原因,该字段的字符集已设置为无效值,在服务器上运行此 SQL 时会出现问题,替换表名,“排序规则”列将显示每个 varchar/char 字段的字符集

SHOW FULL COLUMNS IN table_name;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET latin1;
Run Code Online (Sandbox Code Playgroud)