数据库表的字符集编码报错问题

一、错误描述

org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
### The error may exist in com/herin/api/modules/rockpressure/mapper/mysql/KyWzPowerMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT  id,area_name,value,create_time  FROM ky_wz_power     WHERE (area_name = ?) AND create_time >=(DATE_FORMAT( NOW(), '%Y-%m-%d' ) - INTERVAL 7 DAY)
### Cause: java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
; uncategorized SQLException; SQL state [HY000]; error code [1267]; Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='; nested exception is java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
	at com.sun.proxy.$Proxy96.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)

Cause: java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation ‘=’

二、解决方案

改变数据库表的字符集

ALTER TABLE `ky_wz_power` CONVERT TO CHARACTER SET utf8;
### MySQL 创建数据库时指定字符集和校对规则报错解决方案 当在创建 MySQL 数据库时遇到与字符集和校对规则相关的错误,通常是由于字符集或校对规则配置不当引起的。以下是详细的分析以及解决方法。 #### 1. 错误原因分析 - **字符集不匹配**:如果的默认字符集为 `latin1` 而应用程序传递的是 UTF-8 编码的数据,则可能导致无法正确存储中文或其他多字节字符[^4]。 - **校对规则冲突**:MySQL 的校对规则决定了字符串比较的方式。例如,默认情况下,`utf8_general_ci` 是区分大小写的,但如果需要严格区分大小写则应使用 `_bin` 类型的校对规则[^3]。 - **连接层字符集问题**:如果没有在客户端连接到服务器时明确指定字符集,可能会导致数据传输过程中发生编码转换错误。 #### 2. 解决方案 ##### 方法一:修改数据库字符集和校对规则 可以通过以下 SQL 命令重新定义现有数据库字符集及其对应的校对规则: ```sql ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 此命令将数据库 `mydb` 的字符集更改为 `utf8mb4` 并应用适合大多数场景的通用排序规则 `utf8mb4_unicode_ci`。 ##### 方法二:创建新数据库时直接指定字符集和校对规则 为了避免后续调整带来的麻烦,在最初创建数据库时就应当明确规定其使用的字符集及相应的校对规则。例如: ```sql CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 上述语句确保新建的数据库能够支持完整的 Unicode 字符范围并采用合理的排序方式[^2]。 ##### 方法三:检查并修正级/列级设置 即使整个数据库层面已经设置了合适的字符集,仍需确认具体格乃至各字段是否也继承了相同的设定。可以利用如下指令查看当前状态: ```sql SHOW FULL COLUMNS FROM your_table_name; ``` 对于不符合预期的部分可通过 ALTER TABLE 进行单独调整。比如更改某一特定列的属性: ```sql ALTER TABLE your_table MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 此外还需注意任何已存在的索引可能也需要重建以反映新的排序依据变化。 ##### 方法四:统一客户端与服务端之间的通信协议 最后一步就是保障所有参与交互的应用程序均采用了相同的标准来处理文本资料。这包括但不限于编程框架内部选项、驱动器初始化参数或者手动调用函数如 set names 来声明期望的工作环境: ```sql SET NAMES 'utf8mb4'; ``` 通过以上措施可有效防止因网络传输环节引入额外干扰而导致最终呈现效果失真现象的发生[^5]。 ### 结论 综上所述,针对 MySQL 中关于字符集和校对规则引发的各种异常状况给出了全面系统的排查思路以及针对性强的技术手段予以应对。只要严格按照推荐流程逐一落实到位即可显著降低此类风险事件再次发生的概率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CAFEBABE 34

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值