数据库字符集编码问题
在进行数据库连接的时候可能报错
java.sql.SQLException: Incorrect string value: '\xE5\x86\xAF\xE6\xB1\x9F' for column 'stuname' at row 1,
这是一个典型的数据库字符集编码问题。错误信息显示,在向数据库插入中文数据时出现了乱码。问题出在以下几个方面:
问题原因
- 数据库字符集设置不正确:MySQL数据库表的字符集不支持中文
- JSP文件编码问题:页面中的中文显示为乱码("鍐睙"、"鐢�")
解决方案
1. 修改数据库字符集
首先检查并修改数据库表的字符集:
sql
-- 查看当前数据库字符集
SHOW CREATE TABLE T_STUDENT;
-- 修改表的字符集为UTF-8
ALTER TABLE T_STUDENT CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 或者修改指定字段的字符集
ALTER TABLE T_STUDENT MODIFY stuname VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE T_STUDENT MODIFY stusex VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
这条SQL语句可以将整个表 T_STUDENT 的默认字符集转换为 utf8mb4,并将所有字符类型列的字符集也转换为 utf8mb4。
执行这条语句后:
- 表的默认字符集变为
utf8mb4 - 表中所有现有的字符类型列(如
VARCHAR、CHAR、TEXT等)都会被转换为utf8mb4 - 字符列的排序规则变为
utf8mb4_general_ci
另外将 utf8mb4 改为 utf8也是可以的。但需要注意它们之间的区别:
- utf8 :MySQL中的
utf8实际上是utf8mb3的别名,只支持最多3个字节的字符,无法存储某些特殊字符(如表情符号) - utf8mb4:真正的UTF-8编码,支持最多4个字节,可以存储所有Unicode字符(包括emoji表情)
修改SQL语句
将原来的语句改为:
sql
ALTER TABLE T_STUDENT CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
或者使用更准确的写法:
sql
ALTER TABLE T_STUDENT CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;
虽然 utf8 可以满足大多数中文应用的需求,但如果你:
- 需要存储emoji表情(如:😊、👍等)
- 需要存储一些特殊的生僻字
- 追求更好的兼容性
建议使用 utf8mb4,因为它是更完整的UTF-8实现。如果只是简单的中文存储,使用 utf8 就足够了。

或者用navicat这种可视化工具在建表的时候就将字符编码设置好

如果表已经建好了也可以在设计表的时候重新更改表的字符设置
一般修改数据库字符集可以解决此类问题,如果不行的话再尝试下面的方法
2. 修改JSP文件编码
在JSP文件开头添加页面编码设置:
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>插入数据</title>
</head>
<body>
<%
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// 在连接URL中添加编码参数
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jspdb?useUnicode=true&characterEncoding=UTF-8",
"root",
"123456"
);
Statement stat = conn.createStatement();
String sql = "INSERT INTO T_STUDENT(STUNO,STUNAME,STUSEX) VALUES('0032','冯江','男')";
int i = stat.executeUpdate(sql);
out.println("成功添加" + i + "行");
stat.close();
conn.close();
} catch (Exception e) {
out.println("错误:" + e.getMessage());
e.printStackTrace();
}
%>
</body>
</html>
3. 创建数据库时设置正确字符集
如果还没有创建表,建议使用以下SQL创建:
sql
CREATE DATABASE jspdb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE jspdb;
CREATE TABLE T_STUDENT (
id INT PRIMARY KEY AUTO_INCREMENT,
stuno VARCHAR(20),
stuname VARCHAR(50),
stusex VARCHAR(10)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
4. 检查MySQL配置文件
在MySQL配置文件(my.ini或my.cnf)中添加:
ini
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
修改后需要重启MySQL服务。
5. 验证字符集设置
执行以下SQL验证字符集设置:
sql
-- 查看数据库字符集
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'jspdb';
-- 查看表字符集
SELECT CCSA.CHARACTER_SET_NAME, CCSA.COLLATION_NAME
FROM INFORMATION_SCHEMA.TABLES T, INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY CCSA
WHERE T.TABLE_SCHEMA = 'jspdb' AND T.TABLE_NAME = 'T_STUDENT'
AND CCSA.COLLATION_NAME = T.TABLE_COLLATION;
按照以上步骤修改后,应该就能正常插入中文数据了。最关键的步骤是修改数据库连接的URL,添加?useUnicode=true&characterEncoding=UTF-8参数。