JDBC链接mysql插入数据后显示问号的原因及解决办法

下面是关于“JDBC链接mysql插入数据后显示问号的原因及解决办法”的完整攻略。

问题描述

在使用JDBC链接mysql进行数据插入的过程中,有时候插入的数据中含有中文字符,但是插入成功后查询数据时会发现,中文字符会被显示为问号“?”。这是为什么?

问题原因

这种情况主要是因为mysql数据库中的表采用了默认的字符集编码方式,即latin1,而我们插入的中文字符使用的是utf-8编码。这样就导致了中文字符无法正确保存到mysql数据库中,插入的时候被替换成了问号“?”。

解决方法

正确的解决方法是在创建数据库表的时候,指定表的字符集编码方式为utf8。可以通过如下语句实现:

CREATE TABLE `table_name` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

其中,character set用于指定字符集编码方式,collate用于指定字符集排序规则。如果不指定,默认采用数据库的字符集及排序规则设定。

此外,还可以通过修改mysql的配置文件“my.cnf”来设置默认字符集编码方式。打开my.cnf文件,在[mysql]和[mysqld]下配置如下选项:

[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8

这样,在创建数据库表时不再需要指定字符集编码方式了,可以自动采用utf8字符集编码方式。

示例说明

下面通过两个示例来详细说明这个问题的产生原因及解决方法。

示例一:插入中文字符时显示问号

1. 准备工作

首先需要准备好mysql数据库,并创建一个包含中文字符的表。具体步骤如下:

  • 创建数据库并指定字符集编码方式为utf8:
CREATE DATABASE test_db CHARACTER SET utf8;
  • 选择创建的数据库:
USE test_db;
  • 创建包含中文字符的表:
CREATE TABLE test_table (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 数据插入

使用JDBC链接mysql,并向表中插入一条中文字符串数据:

String sql = "INSERT INTO test_table (name) VALUES ('中文字符串')";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();

3. 查询数据

查询数据显示的结果是问号:

SELECT * FROM test_table;

结果:

+----+----------------+
| id | name           |
+----+----------------+
|  1 | ?????????????? |
+----+----------------+

4. 解决方法

可以在创建数据库表时,指定表的字符集编码方式为utf8:

CREATE TABLE test_table (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

重新插入数据,查询结果正确:

SELECT * FROM test_table;

结果:

+----+------------------+
| id | name             |
+----+------------------+
|  1 | 中文字符串        |
+----+------------------+

示例二:通过修改mysql配置文件设置默认字符集编码方式

1. 准备工作

同上。

2. 修改mysql配置文件

打开mysql的配置文件“my.cnf”,在[mysql]和[mysqld]下添加如下选项:

[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8

3. 数据插入

同上。

4. 查询数据

同上。

5. 解决方法

修改完mysql配置文件后,重新启动mysql服务,打开mysql客户端查看当前数据库和表的默认字符集编码方式:

SHOW VARIABLES LIKE "%character%"; 

结果:

+--------------------------+------------------------------------------------------------+
| Variable_name            | Value                                                      |
+--------------------------+------------------------------------------------------------+
| character_set_client     | utf8                                                       |
| character_set_connection | utf8                                                       |
| character_set_database   | utf8                                                       |
| character_set_filesystem | binary                                                     |
| character_set_results    | utf8                                                       |
| character_set_server     | utf8                                                       |
| character_set_system     | utf8                                                       |
| character_sets_dir       | /usr/local/mysql-5.7.23-macos10.13-x86_64/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------------+

可以看到,当前数据库和表的字符集编码方式都已经是utf8,重启mysql客户端后再次查询数据结果正确。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JDBC链接mysql插入数据后显示问号的原因及解决办法 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Spring security登录过程逻辑详解

    我将详细讲解“Spring security登录过程逻辑详解”的攻略。具体内容如下: 标题 Spring security登录过程逻辑详解 介绍 Spring Security是基于Spring的安全框架,提供了认证和授权的功能,是保障应用系统安全的重要组成部分。本文将详细介绍Spring Security的登录过程,并结合代码示例进行演示。 正文 Spri…

    Java 2023年5月20日
    00
  • Java运行时动态生成类实现过程详解

    Java运行时动态生成类实现过程详解 Java运行时动态生成类是一种十分强大的功能,它可以帮助我们在程序运行时生成Java类并进行动态修改和加载。在本文中,我们将深入讲解Java运行时动态生成类的实现过程,以帮助读者更好地掌握这一技术。 1. 类的动态生成 Java中,类的动态生成可以通过Java字节码实现。Java字节码是Java源代码编译后的代码,也就是…

    Java 2023年5月26日
    00
  • Spring Boot Maven Plugin打包异常解决方案

    下面我来详细讲解如何解决“Spring Boot Maven Plugin打包异常”的问题。 问题描述 在使用Spring Boot Maven Plugin打包时,有时可能会遇到如下异常: [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3…

    Java 2023年5月26日
    00
  • 如何使用线程池?

    使用线程池可以有效地管理系统中的线程资源,从而提高程序的运行效率和性能,以下是使用线程池的完整使用攻略。 创建线程池 要使用线程池,首先需要创建线程池。线程池可以使用Java提供的ExecutorService类来创建,ExecutorService是一个线程池创建和管理类,可以通过Executors工厂方法来创建不同类型的线程池,包括固定大小线程池、可缓存…

    Java 2023年5月10日
    00
  • Java编程中的构造函数详细介绍

    Java中的构造函数是一种特殊的方法,用于创建对象并对其进行初始化。与一般的方法不同,构造函数没有返回类型,并且始终与类名相同。在本文中,我们将详细介绍Java编程中的构造函数,包括定义、使用以及常见问题。 定义构造函数 要定义构造函数,请使用与类名相同的名称,且不带返回类型。通常情况下,构造函数的参数列表与类的属性相似,用于对对象进行初始化。以下是一个简单…

    Java 2023年5月26日
    00
  • Java介绍多线程计算阶乘实现方法

    Java介绍多线程计算阶乘实现方法 多线程是Java编程语言中提供了一种处理器和其他资源的并行协作方式。它可以为程序员提供一种实现异步编程、并行代码以及提高程序性能的方式。本文将介绍在Java中如何通过多线程计算阶乘。 基本概念 阶乘是一个正整数的连乘积,如4! = 4 * 3 * 2 * 1 = 24。计算阶乘是一种高 CPU 使用率的密集计算,这意味着使…

    Java 2023年5月18日
    00
  • jsp Ewebeditor使用说明

    JSP EWebEditor使用说明 什么是JSP EWebEditor JSP EWebEditor是一个基于JSP技术的所见即所得编辑器。它可以帮助开发者快速地生成富文本编辑器,该编辑器可应用于web页面以及各种不同的应用程序。JSP EWebEditor相比其他编辑器,其最大的特点是易于使用和安装。 JSP EWebEditor安装方法 下载并解压 J…

    Java 2023年6月15日
    00
  • SpringMVC实现表单验证功能详解

    以下是关于“SpringMVC实现表单验证功能详解”的完整攻略,其中包含两个示例。 SpringMVC实现表单验证功能详解 SpringMVC是一种常用的Web开发框架,它提供了一种方便的方式来处理表单验证。在本文中,我们将讲解SpringMVC如何实现表单验证功能。 表单验证实现原理 SpringMVC表单验证是通过使用javax.validation A…

    Java 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部