【MySQL】连接MySQL时,字符无法识别(java.sql.SQLException: Unknown character set index for field '224' received )

本文讲述了在使用MySQL数据库过程中遇到的字符集问题,特别是在更改字符集为utf-8mb4后出现的异常情况及解决办法。

连接MySQL时,字符无法识别



这个是之前遇到的问题,当时在网上看到MySQL的字符集有选项为utf-8mb4,据说是utf-8的升级版,于是乎就有了下面的故事。
主要异常:java.sql.SQLException: Unknown character set index for field ‘224’ received from server.

异常

昨天还可以的项目今天就搞不定了。程序向我抛了一堆异常:

二月 27, 2017 7:39:59 下午 com.mchange.v2.log.MLog <clinit>
信息: MLog clients using java 1.4+ standard logging.
二月 27, 2017 7:39:59 下午 com.mchange.v2.c3p0.C3P0Registry banner
信息: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
二月 27, 2017 7:39:59 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 30000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1pmfv249mzc9i32rpv5yt|114e4582, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1pmfv249mzc9i32rpv5yt|114e4582, idleConnectionTestPeriod -> 30, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql://localhost:3306/productstore, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 30, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements -> 200, maxStatementsPerConnection -> 0, minPoolSize -> 10, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
二月 27, 2017 7:40:19 下午 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@3f3d8d82 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
二月 27, 2017 7:40:19 下午 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@3f3d8d82 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3
    Active Threads: 3
    Active Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3bfdef54 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1c6b9291 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@5a637c2a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
    Pending Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@396cd7c2
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@18c91f02
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3c12c904
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@754b446b
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@207908f6
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@6a3b5f21
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@5fe2a603
Pool thread stack traces:
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
        java.lang.Thread.sleep(Native Method)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
        java.lang.Thread.sleep(Native Method)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
        java.lang.Thread.sleep(Native Method)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
二月 27, 2017 7:40:28 下午 com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask run
警告: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3bfdef54 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.sql.SQLException: Unknown character set index for field '224' received from server.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
    at com.mysql.jdbc.Connection.getCharsetNameForIndex(Connection.java:3556)
    at com.mysql.jdbc.Field.<init>(Field.java:192)
    at com.mysql.jdbc.MysqlIO.unpackField(MysqlIO.java:731)
    at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:387)
    at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2076)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1451)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1787)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
    at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
    at com.mysql.jdbc.Connection.loadServerVariables(Connection.java:4478)
    at com.mysql.jdbc.Connection.initializePropsFromServer(Connection.java:4062)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2789)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

很多异常直接懵逼,提示有无法识别的字符,但是当时没有想到是修改字符集导致的,一直以为程序中文件的编码或者是我的存储的字符有特殊的非法字符,后来检查了很久觉得自己很没有问题,于是就去网上搜索了,找到了相同的问题,utf-8mb4。就是因为这个原因。

解决

因为MySQL数据库以utf8mb4解析客户端发送的请求,导致建立连接的时候得到 java.sql.SQLException: Unknown character set index for field ‘224’ received from server.
从而导致连接创建不成功。
后来我就把MySQL的字符集改了回去,就没有问题了,所以说不要瞎改字符集,不要作死。

### 关于 `java.sql.SQLException: Unknown character set index '255'` 的解决方案 该异常通常发生在 MySQL 数据库连接过程中,当服务器返回了一个未知的字符集索引(即 255),而客户端无法识别字符触发。以下是详细的分析和解决办法: #### 原因分析 1. **MySQL 字符集不匹配** 客户端与数据库服务器之间的字符集设置可能存在冲突或未正确指定。如果服务器使用的字符集版本较新,而 JDBC 驱动程序未能支持,则可能导致此类错误[^1]。 2. **JDBC URL 参数缺失** 如果在建立数据库连接未显式定义字符编码参数 (`characterEncoding`),则可能会导致默认字符集与实际需求不符的情况发生[^2]。 3. **驱动兼容性问题** 使用的老版 MySQL Connector/J 可能存在对某些特定字符集的支持不足情况。因此升级到最新稳定版本可能是必要的一步措施之一[^3]。 4. **字段数据类型特殊处理不当** 当表结构中包含 BLOB 或 TEXT 类型列,并且这些列存储的数据涉及非标准 ASCII 编码也容易引发类似的警告消息;另外还有可能是因为某个具体记录里确实存有非法字节序列所致[^4]。 #### 解决方案 针对以上提到的各种可能性提供如下几种可行的修复建议: 1. **修改 JDBC 连接字符串** 在创建 Connection 对象的候通过增加额外选项来强制指明所期望采用的文本表示形式: ```java String url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8"; Connection conn = DriverManager.getConnection(url, username, password); ``` 上述代码片段展示了如何利用附加属性 `useUnicode=true` 和 `characterEncoding=UTF-8` 来确保双方都统一使用 UTF-8 编码体系进行通信交流[^2]. 2. **更新 MySQL 驱动器至最新版本** 访问官方站点下载最新的 mysql-connector-java jar 文件并替换项目依赖中的旧版本组件。这样可以充分利用厂商持续改进后的成果从而减少潜在风险因素的影响程度[^3]. 3. **调整 MySQL Server 设置** 登录目标实例之后执行命令查看当前全局变量状态以及会话级别局部设定值是否存在差异之处: ```sql SHOW VARIABLES LIKE '%char%'; SET GLOBAL collation_server='utf8_general_ci'; -- 修改为适合环境所需的排序规则 ALTER DATABASE testdb CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 此外还需注意检查 my.cnf (Linux)/my.ini(Windows) 中是否有相关条目被误配或者遗漏掉的情形出现. 4. **验证数据合法性** 利用工具导出受影响表格内容逐一排查其中是否藏匿着不符合预期格式要求的信息单元项。一旦发现可疑对象立即采取相应补救手段予以修正恢复正常形态后再重新导入回原位置继续正常使用即可消除报错现象[^4]. ```python def validate_data(file_path): with open(file_path, encoding="utf-8") as f: try: content = f.read() # Perform validation logic here... except UnicodeDecodeError as e: print(f"Invalid data detected! Error details:{e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值