数据库字符集编码问题

数据库字符集编码问题

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

相关推荐
xuzhiqiang07244 小时前
MySQL——数据库的操作
数据库·mysql·oracle
德迅云安全-小潘4 小时前
德迅零域(微隔离):破解云时代横向渗透困局的“手术刀”
网络·数据库·安全
敲代码的哈吉蜂4 小时前
高可用集群Keepalived
运维·服务器·网络·数据库
Dxy12393102164 小时前
在 DrissionPage 中设置代理
数据库
青春:一叶知秋4 小时前
【Redis存储】redis事务
数据库·redis·缓存
v_cxsj8135 小时前
学会写导师都说好的论文——Spring Boot高校实习管理平台18517【部署教程+可完整运行源码+数据库】
数据库·spring boot·实习信息·企业招聘
jjjxxxhhh1236 小时前
[Google Test]- Google Test Ubuntu 完整验证指南
linux·数据库·ubuntu
三无少女指南6 小时前
开发者环境配置:用 Ollama 实现本地大模型部署(附下载慢的解决方案
c语言·开发语言·数据库·ubuntu
Pika7 小时前
深入浅出Compose HitTest 机制
android·android jetpack