数据库字符集编码问题

数据库字符集编码问题

    • 问题原因
    • 解决方案
      • [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参数。

相关推荐
TDengine (老段)2 小时前
TDengine IDMP 组态面板 —— 总体介绍
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
jwn9992 小时前
【Mysql】:如何恢复误删的数据?
数据库·mysql
yashuk2 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
lzp07912 小时前
mysql之联合索引
数据库·mysql
qq5680180762 小时前
【MySQL】超详细MySQL常用日期格式转换函数、字符串函数、聚合函数(最新版)
数据库·mysql
逆境不可逃3 小时前
【从零入门23种设计模式21】行为型之空对象模式
java·开发语言·数据库·算法·设计模式·职场和发展
灰阳阳3 小时前
Redis的缓存机制
数据库·redis·缓存
wenlonglanying3 小时前
【Redis】设置Redis访问密码
数据库·redis·缓存
@insist1233 小时前
软件设计师-数据库技术基础:系统组成、三级模式两级映像与数据模型核心考点解析
数据库·软考·软件设计师
剑锋所指,所向披靡!3 小时前
初始MySQL
数据库·mysql