一:MySQL相关的中文编码错误解决
在一个用Struts + Spring+ Hibernate + Mysql架构的的项目里,通过前台表单向后台MySql数据库添加
数据,当遇到提交中文信息的时候,问题总是比较多,我见过的出错的情况有两种:
1)错误情况1:
ERROR 1366 (HY000): Incorrect string value
Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1
Hibernate flushing: Could not execute JDBC batch update; uncategorized SQLException for SQL [insert into blog (comments, content, createdate, description, tid, title, uid, id) values (?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [HY000]; error code [1366]; Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1; nested exception is java.sql.BatchUpdateException: Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1
2)错误情况2:
提交时不报错,但是数据库中插入的中文显示为如“???”的乱码,同时在控制台打印的也是“???”的乱码字符。
因此涉及到中文字符的问题时,要格外注意“字符集编码”的问题。
====================
总结一下,在这样一个项目里,涉及到设置字符集的地方有:
1、JSP页面文件的编码:
<%@ page pageEncoding="utf-8"%>
2、Struts、Spring配置文件(XML)的编码:
<?xml version="1.0" encoding="utf-8"?>
3、Hibernate映射文件的编码:
<?xml version="1.0" encoding="utf-8"?>
4、数据源配置中jdbcurl(数据库连接)指定的编码:
如果在spring配置文件applicationContext.xml里配置,在数据源的节点中添加jdbcUrl属性如下:
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf-8
或者,如果在hibernate配置文件中,可以添加如下两个属性的配置代码:
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">utf-8</property>
5、Mysql默认字符集:
在Mysql的安装根目录下,my.ini中:
# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=utf-8
安装时,默认的字符集是latin1.
Mysql默认字符集,可以在安装时配置,也可以通过Mysql自带的MySQL Server Instance Config Wizard重新配置,配置后重启服务才可生效。
6、数据库表字段的字符集:
MySQL对于字符集的指定可以细化到一个数据库,一张表,一列(字段),应该用什么字符集。
通过在create语句中添加character set 参数指定相应的字符集,如果不指定,则会默认使用其上一个层
级的字符集。
==============问题分析=============
那么,来分析一下,问题可能是出现在什么地方?
结合以上总结的可能出错的几个地方,我逐一进行了测试,最后发现和预想的结果一致:
通过报错信息可以看出,这个问题应该是表单提交的中文字符与Mysql本身的字符集的设置有冲突导致
的,因此排除项目中那些与页面文件相关的字符集设置。
网上有些地方说,这个问题与下面这个配置中指定的字符集相关:
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf-8
但是,经过我的验证,问题可能并不在此。
经过反复的测试验证,我确定问题就出在Mysql本身默认字符集的设置上。
通过命令: mysql> SHOW VARIABLES LIKE 'character%';
查看Mysql默认字符集的相关设置:
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | D:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
+--------------------------+---------------------------------+
由于表是根据hibernate映射文件在spring容器加载启动时自动创建的,没有为数据库、表和表的字段
指定字符集,因此,创建时均使用Mysql默认的latin1字符集,而这个字符集显然根本不可能处理中文字符,
上面的报错信息就是因为它而产生的。
因此,通过修改Mysql的默认字符集或者在创建数据库、表和表的字段时指定字符集解能决这个问题。
下面,以修改Mysql的默认字符集为例说明。
为了让Mysql支持中文字符,可以把它的默认字符集设置为:
utf-8 ——支持几乎所有字符
gb2312 ——是简体中文的码
gbk ——支持简体中文及繁体中文
中的任何一个。
修改默认字符集的方法如下:
(1) 最简单的修改方法,就是修改Mysql的my.ini文件中的字符集键值,
如 default-character-set = utf8
character_set_server = utf8
修改完后,重启mysql的服务,service mysql restart。
使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改成utf8
+--------------------------+---------------------------------+
| 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
一:基本指令
1启动数据库(-h可以不写,默认localhost)
PS C:\WINDOWS\system32> mysql -h localhost -u root -p
Enter password: ******
mysql> exit;
Bye
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> mysql -u root -p
Enter password: ******
2查看,创建,操作,删除——————>数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| php |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database 创建数据库A;
Query OK, 1 row affected (0.05 sec)
mysql> use 创建数据库a;(可不加分号)
Database changed
mysql> drop database 创建数据库a;
Query OK, 0 rows affected (0.13 sec)
3,mysql数据库的名字不能修改
4创建,查看——————>表table/修改表名,删除表,查看表内
mysql> use php;
Database changed
mysql> create table yuan(
-> id int,
-> name varchar(20),
-> age int,
-> area varchar(20)
-> );
Query OK, 0 rows affected (0.39 sec)
mysql> show tables;
+---------------+
| Tables_in_php |
+---------------+
| class |
| fei |
| msg |
| tesk |
| yuan |
+---------------+
5 rows in set (0.00 sec)
mysql> rename table yuan to xu;
Query OK, 0 rows affected (0.16 sec)
mysql> show tables;
+---------------+
| Tables_in_php |
+---------------+
| class |
| fei |
| msg |
| tesk |
| xu |
+---------------+
5 rows in set (0.00 sec)
mysql> drop table xu;
Query OK, 0 rows affected (0.21 sec)
mysql> show tables;
+---------------+
| Tables_in_php |
+---------------+
| class |
| fei |
| msg |
| tesk |
+---------------+
4 rows in set (0.00 sec)
mysql> desc fei;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| stu | int(11) | YES | | NULL | |
| name | varchar(100) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| area | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
二:增删改查
1,解决字符集问题,需要声明字符
默认建表一般为utf—8,windows黑窗口为gbk
查看内部字符集
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-----------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | C:\mysql5.7\share\charsets\ |
+--------------------------+-----------------------------+
8 rows in set, 1 warning (0.00 sec)
声明字符集
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
设置字符集
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
2 增
mysql> insert into fei
-> (stu,name,age,area)
-> values
-> (5,'小媛',23,'静宁'),
-> (6,'小旭',22,'静宁');
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 3 | 丽丽 | 27 | 甘肃 |
| 4 | 媛媛 | 27 | 静宁 |
| 5 | 小媛 | 23 | 静宁 |
| 6 | 小旭 | 22 | 静宁 |
+------+------+------+------+
6 rows in set (0.00 sec)
3删(只能删行)
mysql> delete from fei
-> where stu=6;
Query OK, 1 row affected (0.10 sec)
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 3 | 丽丽 | 27 | 甘肃 |
| 4 | 媛媛 | 27 | 静宁 |
| 5 | 小媛 | 23 | 静宁 |
+------+------+------+------+
5 rows in set (0.00 sec)
mysql> delete from fei
-> where stu>4;
Query OK, 1 row affected (0.08 sec)
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 3 | 丽丽 | 27 | 甘肃 |
| 4 | 媛媛 | 27 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
4 改
mysql> update fei
-> set
-> stu=2,
-> name='花花';
Query OK, 4 rows affected (0.09 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 2 | 花花 | 25 | 甘肃 |
| 2 | 花花 | 24 | 甘肃 |
| 2 | 花花 | 27 | 甘肃 |
| 2 | 花花 | 27 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
mysql> update fei
-> set
-> stu=1,
-> name='飞飞'
-> where
-> age=25;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 花花 | 24 | 甘肃 |
| 2 | 花花 | 27 | 甘肃 |
| 2 | 花花 | 27 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
mysql> update fei
-> set
-> stu=2,
-> name='明明'
-> where
-> age=24;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 2 | 花花 | 27 | 甘肃 |
| 2 | 花花 | 27 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
mysql> update fei
-> set
-> stu=4,
-> name='媛媛'
-> where
-> area='静宁';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 2 | 花花 | 27 | 甘肃 |
| 4 | 媛媛 | 27 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
mysql> update fei
-> set
-> age=26
-> where
-> stu=4;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 2 | 花花 | 27 | 甘肃 |
| 4 | 媛媛 | 26 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
mysql> update fei
-> set
-> stu=3
-> where
-> age=27;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 3 | 花花 | 27 | 甘肃 |
| 4 | 媛媛 | 26 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
5 查
所有行所有列
mysql> select *from fei;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 1 | 飞飞 | 25 | 甘肃 |
| 2 | 明明 | 24 | 甘肃 |
| 3 | 花花 | 27 | 甘肃 |
| 4 | 媛媛 | 26 | 静宁 |
+------+------+------+------+
4 rows in set (0.00 sec)
部分行
mysql> select *from fei where stu>2;
+------+------+------+------+
| stu | name | age | area |
+------+------+------+------+
| 3 | 花花 | 27 | 甘肃 |
| 4 | 媛媛 | 26 | 静宁 |
+------+------+------+------+
2 rows in set (0.00 sec)
部分列
mysql> select stu,age,area from fei;
+------+------+------+
| stu | age | area |
+------+------+------+
| 1 | 25 | 甘肃 |
| 2 | 24 | 甘肃 |
| 3 | 27 | 甘肃 |
| 4 | 26 | 静宁 |
+------+------+------+
4 rows in set (0.00 sec)
部分行部分列
mysql> select stu,age,area from fei where stu>2;
+------+------+------+
| stu | age | area |
+------+------+------+
| 3 | 27 | 甘肃 |
| 4 | 26 | 静宁 |
+------+------+------+
2 rows in set (0.00 sec)