返回
编程
分类

新生察觉当数据仓库储存款和储蓄汉字时存在乱码难点,mysql在linux下乱码难题

日期: 2020-01-02 08:16 浏览次数 : 106

MySQL控制台更新数据乱码解决

我在虚拟机上安装了redhat并安装了mysql数据库,并在本地通过java访问,直接使用jdbc访问。

MySQL数据库乱码-Linux下乱码问题一

 

后来发现当数据库存储汉字时存在乱码问题,随后在网上找资料进行解决,现在问题已经解决,来总结一下乱码的几个问题。

 

问题:

 

乱码问题是很让人抓狂的问题,下面我将记录一下linux下mysql乱码问题的解决方法。

在MySQL控制台中输入如下语句:

更改数据库默认字符集编码:

 

 

更改mysql配置文件,这个配置文件在/etc/my.cnf,可能安装mysql后这个文件就有了,如果没有,请回到根目录然后查询cnf文件:

mysql在linux下乱码问题

INSERT INTO table_name VALUES ('中文');

Java代码  

一、操作

 

find / -iname '*.cnf' -print  

 

最终在数据库存放的数据为乱码。

 拷贝 small.cnf、my-medium.cnf、my-huge.cnf、my-innodb-heavy-4G.cnf其中的一个到/etc下,改名为my.cnf:

必威官网亚洲体育 ,mysql默认字符集是latin1,但是我们大部分程序使用的字符集是utf8,我们就需要修改mysql的字符集了。

 

Java代码  

 

解决:

cp /usr/share/mysql/my-medium.cnf /etc/my.cnf  

1)查看默认编码

添加mysql客户端连接的字符集参数。(下面我们假设数据库的编码为utf-8)

 拷贝路径根据查询出来的结果修改。

 

 

修改my.cnf

show variables like 'character%';

+--------------------------+----------------------------+ 

| 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 | /usr/share/mysql/charsets/ | 

+--------------------------+----------------------------+ 
  1. 在控制台启动命令之后添加字符集参数

Java代码  

 

 

vi /etc/my.cnf  

 

1
$ mysql --default-character-set=utf8

 在[client]下添加

Mysql下默认的编码是latin1

 

Java代码  

 

 

default-character-set=gbk  

2)查看默认排序方式

注意,这边的的字符集是utf8而不是utf-8。

 在[mysqld]下添加

 

 

Java代码  

show variables like 'collation_%';

+----------------------+-----------------+ 
| Variable_name        | Value           | 
+----------------------+-----------------+ 
| collation_connection | latin1_swedish_ci | 
| collation_database   | latin1_swedish_ci | 
| collation_server     | latin1_swedish_ci | 
+----------------------+-----------------+ 
  1. 在mysql的配置文件my.cnf中添加字符集参数

default-character-set=gbk  

 

 

 然后重启mysql。

3)修改默认字符集

在/etc/my.cnf文件中添加如下配置

登录mysql查询是否生效:

 

 

Java代码  

修改文件/etc/my.cnf内容

1
[mysql]
2
default-character-set=utf8

mysql> show variables like 'collation_%';  

 

 

mysql> show variables like 'character_set_%';  

在[client]下添加如下语句

 

注意如果你设置的是UTF-8请设置utf8,而不是utf-8,否则你的mysql重启时不能启动。

 

问题: 在MySQL控制台中输入如下语句: INSERT INTO table_name VALUES (中文); 最终在数据库存放的数据为乱码。 解决...

 

default-character-set=utf8  

 

 

修改数据库字符集后再修改数据库的字符集:

在[mysqld]下添加

Java代码  

 

mysql>use mydb  

default-character-set=utf8

mysql>alter database mydb character set gbk;  

 

 建议是在创建数据库时就指定字符集

init_connect='SET NAMES utf8'    ##设定连接mysql是使用UTF8编码

Java代码  

 

mysql>create database mydb character set gbk;  

修改好后,重启mysql服务即可

除了使用命令来修改数据的字符集,也可以修改其配置文件

 

修改 /var/lib/mysql/mydb/db.opt

4)另外一种修改字符编码方法

Java代码  

 

default-character-set=latin1  

登录mysql后,输入如下内容

default-collation=latin1_swedish_ci  

 

 为

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 ; 


mysql> SET collation_connection = utf8 ; 
mysql> SET collation_database = utf8 ; 
mysql> SET collation_server = utf8 ; 

Java代码  

 

default-character-set=gbk  

5)重新查看

default-collation=gbk_general_ci  

 

 重起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/share/mysql/charsets/
| 
+--------------------------+---------------------------------+

show variables like 'collation_%';

+----------------------+-----------------+ 

| Variable_name        | Value           | 

+----------------------+-----------------+ 

| collation_connection | utf8_general_ci | 

| collation_database   | utf8_general_ci | 

| collation_server     | utf8_general_ci | 

+----------------------+-----------------+ 

 

 

建表时注意:

 

除了修改mysql和其数据库的字符集外,要注意建表时你可能用的是导出的SQL语句,这些语句中可能包含了建表的字符集,一定要修改或删除这些语句:

6)使用JDBC连接mysql时需要将连接字符串改为如下方式:

Sql代码  

 

CREATE TABLE `NewTable` (  

jdbc:mysql://localhost/mysql?useUnicode=true&characterEncoding=UTF-8

`id`  int(11) NOT NULL ,  

 

`name`  varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL ,  

已utf8的方式连接

`age`  int(100) NULL DEFAULT NULL ,  

 

PRIMARY KEY (`id`)  

二、概念

)  

 

ENGINE=MyISAM  

character-set-server/default-character-set:服务器字符集,默认情况下所采用的。

DEFAULT CHARACTER SET=gbk COLLATE=gbk_chinese_ci  

 

CHECKSUM=0  

character-set-database:数据库字符集。

ROW_FORMAT=DYNAMIC  

 

DELAY_KEY_WRITE=0  

character-set-table:数据库表字符集。

;  

 

 

character-set-client:客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。

连接方面:

 

如果数据库配置正确,那么使用管理工具如Navicat for MySQL时就不会有问题了,但是在程序中难免还是有问题。 

character-set-results:结果字符集。服务器向客户端返回结果或者信息时,结果以该字符集进行编码。

除了对于数据库方面的注意外,在连接数据库要注意指定连接的字符集

 

Java代码  

统一设置字符集编码使用语句:set names utf8

jdbc:mysql://192.168.154.128:3306/t2?useUnicode=true&characterEncoding=gbk  

 

 

三、导入导出防止乱码

程序方面:

 

可是就算到这里仍然可能是乱码,但是没有那么严重了,这就要你在代码中进行转换了。

1.导出数据库使用命令(在cmd下输入)

Java代码  

 

String newStr = new String(s.getBytes("ISO-8859-1"),"GBK");  

mysqldump -u用户名 -p密码 -h服务器地址 数据库名称 --default-character-set=utf8 --hex-blob >导出数据库.sql

 

 

 也许有人会说,乱码就是乱码,还严重不严重?其实乱码在我看来分为两种情况,一种就是存储或者其他方面乱了,而另一种是存储是对的但是显示有问题。比如你设置正确后使用管理工具没有问题但是程序读取就有问题。

 --default-character-set=utf8 代表使用urf8编码导出数据

如果你看到的乱码是根本不知道显示的是什么,那就是严重的。但如果你看到的是????那在我看来就是缺少转换,就不属于大问题。当然这是个人看法,请大家不要钻牛角尖。

 

 

 --hex-blob 代表以16进制导出数据库

 

 

 

2.导入数据库使用命令(在cmd下输入)

作者 cuisuqiang

 

后来发现当数据库存储汉字时存在乱码问题,随...

mysql -u用户名 -p密码 -h服务器地址 数据库名称 --default-character-set=utf8 --hex-blob  <导出数据库.sql

 

除了使用上面的命令导入数据库外,还可以登录mysql,使用source命令导入

 

mysql> source 导出数据库.sql

 

注:blob字段存放的是二进制数据,故其没有字符集编码,在window和linux使用以上方式还是会有乱码的问题,故建议将blob类型修改为text类型,才不会出现乱码。blob类型数据往text类型转换,自己写一个简单的代码,从blob读出数据以字符串的形式存到text字段即可。

 

乱码问题是很让人抓狂的问题,下面我将记录一下linux下mysql乱码问题的解决方法。 mysql在linux下乱码问题...