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

Posted

技术标签:

【中文标题】从服务器接收到的字段的未知字符集索引【英文标题】:Unknown character set index for field received from server 【发布时间】:2011-05-05 04:31:19 【问题描述】:

我有一个 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.hibe rnate.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.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:100) springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)在 org.acegisecurity.intercept.method.aopalliance.MethodSecurityI nterceptor.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(本机方法)在 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.doFil ter(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.acegisecurit y.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。服务(网络包含er.java:579)

此错误发生在生产环境中,因此我不知道是哪个查询产生了问题,但我知道我的所有表都没有名为“123”的列。您对可能导致此问题的原因有什么建议吗?

编辑:作为后续,我发现此行为是 known bug in MySQL 5.0.4,但我没有找到好的解决方法,因为我没有升级 mySQL 的选项。

【问题讨论】:

不能升级MySQL,但可以降级吗?错误报告表明使用 5.0.3 而不是 5.0.4 应该可以避免该问题。 【参考方案1】:

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

SHOW FULL COLUMNS IN table_name;

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

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

【讨论】:

【参考方案2】:

在内部,MySQL 正在跨列映射索引。通常这是使用表示列索引的整数来完成的。大多数索引实际上是构建后的复合索引(col 1 + col 3),形成类似field 13

当堆栈不是精确副本时,将数据从开发迁移到生产时,可能会发生这种情况。

正如3urdoch 提到的,您可以使用内部 MySQL 函数提取字符集;然后将表的字符集更改为兼容的编码。

或者(我愿意打赌这个问题来自哪里)您可以检查为Production 加载的驱动程序是否与为Other 服务器加载的驱动程序匹配。 如果Development/Other 服务器仍在用于测试并迁移到Production,这将防止再次发生问题。

【讨论】:

以上是关于从服务器接收到的字段的未知字符集索引的主要内容,如果未能解决你的问题,请参考以下文章

客户端通信层从 Advantage 数据库服务器接收到的数据比预期的要多

MFC主线程只关注Dialog,需要处理从服务器接收到的数据

如何解压缩从 iPhone 上的服务器接收到的 gzip 文件?

以编程方式结合 Textview 和 EditText 创建自定义字段

如何索引 PyMongo 中已知字段的未知字段?

使用 DataContractSerializer 从 WCF 服务接收到的序列化响应