数据库字符集编码问题

数据库字符集编码问题

    • 问题原因
    • 解决方案
      • [1. 修改数据库字符集](#1. 修改数据库字符集)
      • [2. 修改JSP文件编码](#2. 修改JSP文件编码)
      • [3. 创建数据库时设置正确字符集](#3. 创建数据库时设置正确字符集)
      • [4. 检查MySQL配置文件](#4. 检查MySQL配置文件)
      • [5. 验证字符集设置](#5. 验证字符集设置)

在进行数据库连接的时候可能报错
java.sql.SQLException: Incorrect string value: '\xE5\x86\xAF\xE6\xB1\x9F' for column 'stuname' at row 1
这是一个典型的数据库字符集编码问题。错误信息显示,在向数据库插入中文数据时出现了乱码。问题出在以下几个方面:

问题原因

  1. 数据库字符集设置不正确:MySQL数据库表的字符集不支持中文
  2. 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
  • 表中所有现有的字符类型列(如 VARCHARCHARTEXT 等)都会被转换为 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参数。

相关推荐
SelectDB15 小时前
Doris & SelectDB for AI 实战:从基础 RAG 到知识图谱增强的完整实现
数据库·人工智能·数据分析
z44247532615 小时前
CSS Grid布局如何实现网格项目的自动增长_设置grid-auto-flow- row
jvm·数据库·python
河野笑生15 小时前
MySQL 范式和反范式详解
数据库
m0_7403524215 小时前
如何在 SvelteKit 中为动态加载的图片实现响应式悬停覆盖层
jvm·数据库·python
今天又在写代码15 小时前
并发问题解决
java·开发语言·数据库
马优晨15 小时前
oracle 的 Schema
数据库·oracle·oracle的schema·数据库的 schema·oracle的schema数据
jinanwuhuaguo15 小时前
OpenClaw协议霸权——从 MCP 标准到意图封建化的政治经济学(第十八篇)
android·人工智能·kotlin·拓扑学·openclaw
gmaajt16 小时前
JavaScript中闭包对垃圾回收器GC标记清除算法的影响
jvm·数据库·python
NineData16 小时前
NineData 亮相 2026 德国汉诺威工业博览会,加速拓展欧洲及全球市场
运维·数据库·人工智能·数据库管理·ninedata·ai服务·玖章算术
撩得Android一次心动16 小时前
Android Room 数据库详解【源码篇】
android·数据库·android jetpack·room