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日

相关文章

  • java开发 线上问题排查命令详解

    Java开发 线上问题排查命令详解 在Java应用线上运行过程中可能会遇到各种问题,例如应用启动失败、性能瓶颈等等。本文将介绍一些常用的Java开发线上问题排查命令,帮助开发人员更快速、准确地定位问题。 查看应用状态 jps jps命令用于列出Java应用进程的PID(进程ID)和名称,可用于检查应用是否正常启动并在运行。 jps 输出示例: 1234 Ap…

    Java 2023年5月27日
    00
  • jsp中select的onchange事件用法实例

    以下是“jsp中select的onchange事件用法实例”完整攻略: 1. 什么是select的onchange事件 select标签是HTML中常用的选项框,而onchange事件则是当下拉选项列表的值发生改变时触发的事件。onchange事件通常与JavaScript函数一起使用,来实现对选项框的动态控制。 2. select的onchange事件用法…

    Java 2023年6月15日
    00
  • 解决SpringBoot跨域的三种方式

    接下来我将详细讲解解决SpringBoot跨域的三种方式及示例操作。 一、什么是SpringBoot跨域 跨域是指在浏览器跨域请求时出现的安全限制,是由浏览器的同源策略造成的。简单来说,即浏览器的同源策略为了保证用户信息的安全,会限制页面发起跨域请求,从而避免恶意的数据访问和攻击。 而SpringBoot作为后台服务框架,不论是前端还是其他后台服务都可能通过…

    Java 2023年5月31日
    00
  • java web实现简单登录注册功能全过程(eclipse,mysql)

    接下来我详细讲解如何使用Java Web实现简单的登录注册功能全过程,以下是步骤: 步骤一:配置开发环境 在开始项目之前,我们需要搭建好相应的开发环境,主要包括Java SE、Eclipse IDE、MySQL等工具和环境的安装和配置工作。 步骤二:创建Maven Web项目 在Eclipse IDE中创建一个Maven Web项目,建议使用Spring框架…

    Java 2023年6月16日
    00
  • Java操作Mysql的方法

    关于Java操作MySQL的方法,需要掌握以下几点: 导入数据库驱动程序 建立数据库连接 创建statement对象,执行SQL语句 处理查询结果集 关闭各种连接 下面将详细介绍这些步骤以及如何实现它们。 导入数据库驱动程序 在Java中操作MySQL,需要先导入MySQL的JDBC驱动程序。如果你使用的是Maven等依赖管理工具,可以直接在pom.xml中…

    Java 2023年5月19日
    00
  • 性能优化包括哪些方面?

    以下是关于性能优化包括哪些方面的完整使用攻略: 性能优化包括哪些方面? 性能优化是指通过改进程序的设计、算法、数据结构、代码实现等方面,提高程序的运行效率和响应速度,减少资源占用和延迟等问题。性能优化包括以下几个方面: 1. 程序设计 程序设计是性能优化的重要方面之一。在程序设计阶段,需要考虑程序的整体架构、模块划分、接口设计等方面,从而保证程序的可扩展性、…

    Java 2023年5月12日
    00
  • 如何在IntelliJ IDEA 2018上配置Tomcat并运行第一个JavaWeb项目

    请参考以下步骤来配置Tomcat并运行第一个JavaWeb项目: 1. 下载和安装Tomcat 首先,下载Tomcat并解压缩到本地。 推荐使用Tomcat 8.0版本。 打开Tomcat/bin目录,双击startup.bat文件启动Tomcat服务器。 2. 在IntelliJ IDEA 2018中配置Tomcat服务器 打开IntelliJ IDEA,…

    Java 2023年5月19日
    00
  • Java中JSON处理工具类使用详解

    Java中JSON处理工具类使用详解 什么是JSON JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。JSON格式常…

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