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

yizhihongxing

下面是关于“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解决jar包依赖的bom

    浅谈Spring解决Jar包依赖的BOM 什么是BOM BOM(Bill of Materials)是Maven项目中用来解决依赖版本管理的组件。它为一个项目指定一个依赖版本的列表,让所有模块都能使用这个预定的库版本来开发和构建应用程序,从而避免由于版本冲突而导致的构建失败问题。 为什么使用BOM 当我们在项目中依赖的第三方库更新版本的时候,我们不得不手动调…

    Java 2023年5月19日
    00
  • AJAX开发简略 (第一部分)

    AJAX开发简略 (第一部分) AJAX (Asynchronous JavaScript and XML) 是一种用于创建快速动态网页的技术,它通过在后台与服务器进行数据交换,使网页不需要重新加载就可以更新特定部分的内容。在本文中,我们将学习如何使用 AJAX 来创建动态页面。本篇文章将分为两个部分,第一部分重点讲解 AJAX 的基础知识,第二部分将介绍如…

    Java 2023年5月23日
    00
  • 使用Appcan客户端自动更新PHP版本号(全)

    使用 Appcan 客户端自动更新 PHP 版本号需要完成以下几个步骤: 1. 准备工作 1.1. 安装 Appcan 客户端 首先需要在本地安装好 Appcan 客户端,并进行登录操作。如果您已经完成了 Appcan 客户端的安装和登录,则可以直接进入下一个步骤。 1.2. 安装并配置 PHP 在使用 Appcan 客户端自动更新 PHP 版本号之前,需要…

    Java 2023年6月15日
    00
  • java开发MyBatis中常用plus实体类注解符详解

    Java开发MyBatis中常用Plus实体类注解符详解 什么是MyBatis Plus? MyBatis Plus是MyBatis的一个增强工具,在MyBatis基础之上进行扩展。MyBatis Plus提供了很多实用的增强功能,如分页查询、条件构造器、逻辑删除、自动填充等,使得开发人员可以更加快捷地编写代码。在MyBatis Plus中,实体类注解符是其…

    Java 2023年5月20日
    00
  • JAVA中简单的for循环异常踩坑

    JAVA中简单的for循环异常踩坑攻略 背景 在JAVA中,for循环是一个非常常用的结构,其语法较为简单易懂。但是在使用中,由于一些细节问题,常常会导致一些难以预料的异常。其中之一就是for循环的异常问题。 问题描述 在JAVA中,for循环的异常问题表现为,当我们对循环变量进行修改过程中,有可能导致循环无法正常进行。这是因为在每一轮循环中,循环变量都会被…

    Java 2023年5月27日
    00
  • 浅谈Java抽象类和接口的个人理解

    浅谈Java抽象类和接口的个人理解 Java是一门面向对象编程语言,面向对象编程的三大特性是封装、继承和多态。抽象类和接口都是Java中体现多态的机制。 抽象类 抽象类是不能被实例化的类,它通常被用于抽象出多个类中的共性并定义出它们的方法名、参数列表、返回类型和访问类型,由其子类来实现这些方法。 抽象类的定义方式为: public abstract clas…

    Java 2023年5月20日
    00
  • Java中InputSteam怎么转String

    转换InputStream为String,可以使用Java中的Scanner类、BufferedReader类、ByteArrayOutputStream类、StringBuilder类等方式。 其中,Scanner类适用于转换小型InputStream,BufferedReader适用于转换大型InputStream,ByteArrayOutputStre…

    Java 2023年5月26日
    00
  • Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办

    为了解决”Mybatis使用MySQL模糊查询时输入中文检索不到结果”的问题,我们需要在Mybatis配置文件中进行一些特定的设置。 1.在Mybatis的配置文件中添加如下代码: <configuration> <settings> <setting name="jdbcTypeForNull" value…

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