下面是关于“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技术站