MySQL乱码管理及字符集相关介绍,mysql基础运行

  在安装完数据库后,使用汉字插入到表中,会报错,需要修改字符集类型,如下图所示:

1.创建用户并授权

1.1 mysql插入中文数据乱码


-- 插入汉字时报错
INSERT INTO User2 VALUES('张三')

一般新建数据库都需要新增一个用户,用于程序连接,这类用户只需要insert、update、delete、select权限。

1.1.1MySQL中添加中文数据并查看检表语句

        我们经常会遇到一些向MySQL数据库中插入中文,但是select出来的时候,却发现是乱码的情况。如我们向表a出入这样一段记录:i

    图片 1

新增一个用户,并授权如下:

a.创建cuizhong测试数据库并查看建表语句

  a (,);
-- 查看字符集
SHOW VARIABLES LIKE ‘character%’;

(1)grant select,delete,update,insert on *.* to admin@'192.168.0.%' identified by '123456';

mysql> create database cuizhong;
Query OK, 1 row affected (0.00 sec)
mysql> show create database cuizhongG
*************************** 1. row ***************************
   Database: cuizhong
Create Database: CREATE DATABASE `cuizhong` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.00 sec)

可能当你访问它的时候,会发现他的结果变成如下图所示:

   如下图所示: character_set_database=iatin1 需要改成utf8或gbk

flush privileges;

提示:如果在安装MySQL时未指定字符集,则mysql默认字符集是latin1。

 图片 2
  打开my.cnf文件,修改参数,再重启
  图片 3
 重启后,再查看SHOW VARIABLES LIKE 'character%'。如下所示:character_set_filesystem不用改,默认使用二进制。
  图片 4

(2)新建用户再授权

b.在cuizhong库下创建一个student表,并查看表结构和建表语句

        要解决字符集的问题,首先要知道现在的系统、数据库、表、客户端等使用什么样的字符集,以及系统支持什么字符集等,下面介绍一些获取相关信息的语句:

  新建一个数据库test2, 字符集默认显示[default]不用改, 在库里新建一个表user1,如下图所示
  图片 5

create user 'test'@'localhost' identified by 'test';

mysql> use cuizhong
Database changed
mysql> show tables;
 -------------------- 
| Tables_in_cuizhong |
 -------------------- 
| student|
 -------------------- 
1 row in set (0.00 sec)

mysql> create table student( id int(4) NOT NULL AUTO_INCREMENT, name char(20) NOT NULL, PRIMARY KEY(id) );
mysql> desc student
-> ;
 ------- ---------- ------ ----- --------- ---------------- 
| Field | Type | Null | Key | Default | Extra  |
 ------- ---------- ------ ----- --------- ---------------- 
| id| int(4)   | NO   | PRI | NULL| auto_increment |
| name  | char(20) | NO   | | NULL||
 ------- ---------- ------ ----- --------- ---------------- 
2    rows in set (0.00 sec)
mysql> show create table studentG
*************************** 1. row ***************************
   Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

1.查看数据库支持的所有字符集

-- 插入汉字成功
INSERT INTO  user1 VALUES('张三')

GRANT ALL ON db1.* TO 'test'@'localhost';

提示:默认建表不指定字符集则继承库的字符集,即latin1。

show  ;或者show  ;

    图片 6

2.创建数据库并指定字符集

c.批量插入数据到student表

2.查看当前状态,里面当然包括字符集的设置:

  对于之前已有的test库,则需要把该库之前的默认字符改过来,如下图所示:
    图片 7

create database test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> insert into student values(1,'zhangsan'),(2,'lisi'),(3,'wanger'),(4,'xiaozhang'),(5,'xiaowang');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from student;
 ---- ----------- 
| id | name  |
 ---- ----------- 
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
 ---- ----------- 
5 rows in set (0.00 sec)
status或者s

3.显示数据库

提示:数字和英文的数据时正常的,不会有乱码问题。

3.查看系统字符集设置,包括所有的字符集设置:

show databases;

d.插入一条中文数据

show variables  ;

show databases like '%test%';

mysql> insert into student values(6,'我是谁');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from student;
 ---- ----------- 
| id | name  |
 ---- ----------- 
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
 ---- ----------- 
6 rows in set (0.00 sec)

得出如何所示结果:

显示当前数据库

出现问题:中文内容乱码

4.查看数据表中字符集设置:

select database();

为什么插入中文数据会出现乱码问题呢?

show  columns  tablename;

4.使用数据库

通过上面的例子我们可以看出客户端字符集和库,表字符集不一样导致乱码问题,所以我们在插入数据的时候要先查看系统字符集和客户端,库表字符集是否一样,不一样将字符集修改一致再插入数据。字符集不一致导致插入乱码解决办法删重新插入。

tablenameG;

use test;

1.1.2 MySQL命令行插入中文数据不乱码实战

5.查看数据库编码:

显示当前用户

a.查看建表语句,注意默认的字符集是latin1

show   dbname;

select user();

mysql> show create table studentG
*************************** 1. row ***************************
   Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

        知道了怎么查找字符集的相关信息之后,我们就要懂得怎么在创建指定对象的时候,为该对象匹配相应的字符集。

5.删除数据库

b.设置MySQL客户端的字符集和建表的字符集latin1一致

1.服务器级:

drop database test;

设置字符集为插入数据表的字符集

在安装MySQL时可以设置服务器的默认编码格式,也可对my.ini做修改,修改[mysqld]里面的character_set_server=utf8,则可设置character_set_server的值。

6.删除用户(系统多余账号)

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

2.数据库级:

(1)drop user "user"@主机域(主机名大写删不掉)

c.再插入一条中文数据

      utf8;

(2)delete from mysql.user where user = 'root' and host = 'test';

mysql> insert into student values(7,'小红');
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
 ---- ----------- 
| id | name  |
 ---- ----------- 
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红  |
 ---- ----------- 
7 rows in set (0.00 sec)

3.表级:

flush privileges;

提示:不乱码了,但是老的数据就没办法解决了。

   ``.`tb_name` (id ()  ,name () ) ENGINEInnoDB  CHARSETutf8;

7.查看数据库版本

上面的是MySQL命令行插入数据不乱码的方法,那么如果更新的数据多就需要执行sql文件更新数据了,所以保证执行sql文件也不乱码怎么办呢?

从下图可看出,定义表的默认字符集为utf8,即使character_set_database为gbk,但是表的列都未utf8

select version();

1.1.3 执行SQL文件插入中文数据不乱码实战

4.列级:

8.查看当前时间

a.将要更新的多个sql语句放在文本文件中如test.sql

   ``.`tb_name` (   id ()  ,   name ()   utf8 );

select now();

mysql> system cat test.sql
set names latin1;
insert into student values(8,'不认识');

从下图可以看到,整个表的默认字符集为gbk,所以没有指定字符集的列都用默认的字符集,而指定了字符集的列name,则使用指定的字符集utf8。

9.查看用户列表

提示:必须要加入set names latin1,确保插入数据不乱码。

        如果已经是创建好的对象,那又应该如何处理呢。我们就应该对指定对象就行修改字符集的操作。

select user,host from mysql.user;

b.在MySQL命令行中通过source调用test.sql文件插入数据


10.查看用户权限

mysql> source test.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
 ---- ----------- 
| id | name  |
 ---- ----------- 
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红  |
|  8 | 不认识|
 ---- ----------- 
8 rows in set (0.00 sec)

对于某一个连接来说,可以使用:

show grants for test@localhost;

小结:执行DQL,DML语句的时候要set name 系统及库表的字符集。

 NAMES  

11.授权主机远程连接数据库

1.1.4 通过MySQL 命令加字符集参数导入数据解决乱码问题

NAMES

 

a. 把要更新的多个SQL语句放入文本中,这次不带set names latin1

相当于

12.企业环境授权

#set names latin1;
insert into student values(9,'李四');
 character_set_client  character_set_results  character_set_connection  charset_name;

(1)对于web连接用户授权尽量采用最小化原则,很多开源软件 还需要create,drop等比较危险的权限

b. 通过MySQL命令加上字符集参数指定latin1字符集导入test.sql

另外、还可以修改配置文件,对[mysql]下增加default-character-set=utf8,配置成你想要的字符集。(个人尝试在my.ini里面配置过,没有成效,不知道是不是被使用的客户端想要的字符集给覆盖掉了呢?)

(2)生成数据库表后,要收回create/drop授权

[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1 cuizhong < test.sql

revoke insert on *.* FROM 'test'@'localhost';

通过-e参数在mysql库外查看结果

       COLLATE collation_name]

生产环境针对主库(写为主读为辅)用户的授权:

[root@localhost ~]# mysql -uroot -p123456 -e "set names latin1;select * from cuizhong.student"
 ---- ----------- 
| id | name  |
 ---- ----------- 
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红  |
|  8 | 不认识|
|  9 | 李四  |
 ---- ----------- 

最简单的方法是直接改my.ini配置文件里面[mysqld]的字段,增加character-set-server=gbk,然后重启mysqld,则可改为你想要的字符集。

后面再说

1.1.5 MySQL插入中文不乱码5中方法小结


13.建表

方法(1):登录mysql先做然后再执行更新语句或执行语句文件


create table student(

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)
mysql> source test.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
 {    } ( 

id int(4) not null,

提示:确保test.sql文件格式正确

例如:

name char(20) not null,

方法(2):在sql文件中指定set names latin1;然后登录mysql,通过如下命令执行。

 ( 

age tinyint(2) not null default '0',

mysql> source test.sql
Query OK, 0 rows affected (0.00 sec)

 

dept varchar(16) default null

方法(3):在sql文件中指定set names latin1 然后通过mysql导入

  • 参考资料:

)ENGINE=InnoDB DEFAULT CHARSET=uft8;

[root@localhost ~]# mysql -uroot -p123456  cuizhong < test.sql
[root@localhost ~]# mysql -uroot -p123456 -e "set names latin1;select * from cuizhong.student"

MySQL的Character Set Support: 

14.增删表字段

提示:这里的cuizhong是库名不是表名。

mysql常用查看库,表字符集命令: 

alter table test add a varchar(20);

方法(4):通过指定mysql命令的字符集参数来实现

MySQL 插入数据时,中文乱码问题的解决:

15.更改表明

#set names latin1;
insert into student values(9,'李四');
[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1 cuizhong < test.sql

 

rename table test to test1;

方法(5)在配置文件里设置客户端及服务端相关参数

 

16mysql插入中文不乱码的5种方法

a.更改my.cnf客户端模块的参数,可以实现set names latin1效果,并永久生效

a ( , ); 可能...

(1)登录mysql,先做"set names latin1",然后再执行语句或语句文件

[client]
default-character-set=latin1

(2)在sql文件中指定set names latin1;然后登录mysql,通过如下命令执行

提示:不需要重启服务,退出重新登陆生效。

mysql>source test.sql

b.在服务端里面再指定latin1字符集

(3)在sql文件中指定set names latin1;然后通过mysql命令导入数据

[mysqld]
Default-character-set=latin1适合5.1 及以前的版本
Default-character-server=latin1 适合5.5

mysql -uroot -poldboy123 oldboy<test.sql

1.2 Mysql数据库字符集知识

mysql -uroot -poldboy123 oldboy -e "set names latin1;select * from oldboy.test";

1.2.1 MySQL数据库字符集介绍

(4)通过指定mysql命令的字符集参数实现--default-character-set=latin1

简单的说,一套文字符号及其编码、比较规则的集合。MySQL数据库字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。其中,字符集是用来定义MySQL数据字符串的存储方式,而校对规则则是定义比较字符串的方式。前面建库的语句中CHARACTER SET latin1即为数据库字符集而COLLATE latin1_swedish_ci 为校对字符集,有关字符集详细内容参考mysql手册,第10张字符集章节。

cat test.sql

1.2.2 MySQL数据库常见字符集介绍

INSERT INTO student VALUES (9,'张三');

使用MySQL时常用的字符集有下表四种

mysql -uroot -poldboy123 --default-character-set=latin1 oldboy<test.sql

图片 8

(5)在配置文件里设置客户端及服务端相关参数

1.2.3 MySQL如何选择合适的字符集

更改my.cnf客户端模块的参数,可以实现set names latin1的效果,并且永久生效

a.如果处理各种各样的文字,发布到不同国家和地区,应选Unicode字符集。对mysql来说就是UTF-8(每个汉字三个字节),如果应用需处理英文,有少量汉字UTF-8更好。

[client]

b.如果只需支持中文,并且数据量很大,性能要求也很高,可选GBK(定长,每个汉字占双字节,英文也占双字节),如果需要大量运算,比较顺序等定长字符集更快,性能高。

default-character-set=latin1

c.处理移动互联网业务,可能需要使用utf8mb4字符集。

提示:无需重启服务,退出重新登录就生效。相当于set names latin1;

1.2.4 查看当前MySQL系统支持的字符集

更改my.cnf参数

[root@localhost ~]# mysql -uroot -p123456 -e "SHOW CHARACTER SET"

[mysqld]

最常用的有四种:

default-character-set=latin1适合5.1及以下版本

[root@localhost ~]# mysql -uroot -p123456 -e "SHOW CHARACTER SET;"|egrep "gbk|utf8|latin1"|awk ' {print $0}'
latin1    cp1252 West European    latin1_swedish_ci    1
gbk    GBK Simplified Chinese    gbk_chinese_ci    2
utf8    UTF-8 Unicode    utf8_general_ci    3
utf8mb4    UTF-8 Unicode    utf8mb4_general_ci    4

character-set-server=latin1适合5.5

查看mysql当前的字符集设置情况

不乱码的思想:linux,客户端,服务端,库,表,程序保证字符集统一

mysql> show variables like 'character_set%';
 -------------------------- ---------------------------------- 
| Variable_name| Value|
 -------------------------- ---------------------------------- 
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

不乱码的思想:建议中英文环境选择utf8

提示:默认情况下character_set_client,character_set_connection,character_set_results三者的字符集和系统的字符集是一致的,是同时修改的。即为:

建库:create database oldboy DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci

[root@localhost ~]# cat /etc/sysconfig/i18n 
LANG="zh_CN.UTF-8"
[root@localhost ~]# echo $LANG
zh_CN.UTF-8

建表:一般情况下,建库是指定字符集,表不用管

1.3 Mysql数据库默认设置的字符集是什么?

create table student

a.先看一下mysql默认情况下设置的字符集

(id int(4) not null auto_increment,

mysql> show variables like 'character_set%';
 -------------------------- ---------------------------------- 
| Variable_name| Value|
 -------------------------- ---------------------------------- 
| character_set_client | gb2312   |
| character_set_connection | gb2312   |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| gb2312   |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

name char(20) not null,

不同字符集参数的含义如下

primary key(id )

Variable_name  | Value  
| character_set_client | latin1  客户端字符集
| character_set_connection | latin1  连接字符集
| character_set_database   | latin1数据库字符集,配置文件指定或建库建表指定
| character_set_results| latin1  返回结果字符集
| character_set_server | latin1服务器字符集,配置文件指定或建库建表指定

)ENGINE= InnoDB AUTO_INCREMENT=10 DEFAULT CHARATERSET=UTF8;

更改linux系统字符集变量后,查看MySQL中字符集的变化

查看校对规则show character set;

[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| Variable_name| Value|
 -------------------------- ---------------------------------- 
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

查看状态

我们发现character_set_connection,character_set_client,character_set_server 三者的字符集和系统的一致也都改成utf8了。

show variables;

1.4 执行set names latin1到底做了什么

show global status;

无论linux系统的字符集是gb2312还是utf8默认情况下插入数据都是乱码的。

set global key_buffer_size=

a.此时查看数据就是乱码

show variables liek 'key_buffer%'

mysql> use cuizhong
Database changed
mysql> select * from student
-> ;
 ---- --------------------- 
| id | name|
 ---- --------------------- 
|  1 | zhangsan|
|  2 | lisi|
|  3 | wanger  |
|  4 | xiaozhang   |
|  5 | xiaowang|
|  6 | ??? |
|  7 | å°çº¢  |
|  8 | ä¸è®¤è¯†   |
|  9 | æŽå››  |
 ---- --------------------- 
9 rows in set (0.10 sec)

作为作业总结

b. 执行完set对应的字符集操作,就解决乱码问题了

mysqldump

(1)先查看一下库和表的字符集

mysqlbinlog

mysql> show create database cuizhongG
*************************** 1. row ***************************
   Database: cuizhong
Create Database: CREATE DATABASE `cuizhong` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.00 sec)
mysql> show create table studentG
*************************** 1. row ***************************
   Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql

(2)我们看库和表的字符集都是latin1,所以执行set names latin1保证字符集一样就不会乱码了。

mysqladmin

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from student;
 ---- ----------- 
| id | name  |
 ---- ----------- 
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红  |
|  8 | 不认识|
|  9 | 李四  |
 ---- ----------- 

 

(3)执行完set字符集操作的结果改变了如下字三个字符集character_set_client,character_set_connection,character_set_results的参数。

客户端字符集

mysql> show variables like 'character_set%';
 -------------------------- ---------------------------------- 
| 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/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

character_set_client

1.5 Mysql命令参数—default-character-set=latin1在做什么?

character_set_connection

(1)先查看一下mysql的字符集

character_set_results

[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| Variable_name| Value|
 -------------------------- ---------------------------------- 
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

set names就该更改了上面三个变量的值

(2)带—default-character-set=latin1 参数登录mysql

 

[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 7
Server version: 5.5.32 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> 

确保mysql数据库插入数据不乱吗解决方案

(3)现在再查看mysql的字符集

统一mysql数据库客户及服务端字符集

mysql> show variables like 'character_set%';
 -------------------------- ---------------------------------- 
| 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/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

1.通常,mysql数据库的下面几个字符集(客户端和服务端)统一成一个字符集,才能确保插入的中文数据可以正确输出。即mysql>show variables like 'character_set%' 结果中的字符集设置尽量统一。当然linux系统的字符集也要尽可能和数据库字符集统一。

(4)带参数登录也是临时修改不带参数登录又变回去了

2、show variables like 'character_set%';命令结果输出如下

[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| 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/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| Variable_name| Value|
 -------------------------- ---------------------------------- 
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

variable_name |value

1.6 确保MySQL数据库插入数据不乱码解决方案

1character_set_client |latin1 #客户端字符集,set names latin1;

1.6.1统一MySQL数据库客户端及服务端的字符集

2character_set_connection |latin1 #连接字符集,set names latin1;

(1)MySQL数据库的下面几个字符集(客户端和服务端)统一成一个字符集才能确保插入的中文数据库可以正常输出。当然,linux系统的字符集也要尽可能和数据库字符集统一。

3character_set_database |latin1 #数据库字符集,配置文件制定或建库建表制定。

(2)show variables like 'character_set%';命令输出结果如下:

4character_set_results |latin1 #返回结果字符集,set names latin1;

Variable_name| Value 
 -------------------------- -------------------------------- 
①character_set_client | latin1  客户端字符集
②character_set_connection | latin1  连接字符集
③character_set_database   | latin1   数据库字符集
④character_set_results| latin1   返回结果字符集
⑤character_set_server | latin1   服务器字符集,配置文件制定或建库建表指定

5character_set_server |latin1 #服务器字符集,配置文件制定或建库建表制定。

其中,①②④三个参数默认情况采用linux系统字符集设置,人工登录数据库执行set names latin1以及mysql指定字符集登录操作,都是改变mysql客户端的client、connection、results3个参数的字符集都为latin1,从而解决插入乱码问题,这个操作可以在my.cnf配置文件里修改mysql客户端的字符集,配置方法如下:

其中,1、2、4 3个参数默认情况采用linux系统字符集设置,人工登录数据库执行“set names latin1“以及mysql制定字符集登录操作,都是改变了mysql客户端的client、connection、results3个参数的字符集为latin1,从而解决了插入中文乱码的问题,这个操作也可以通过更改my.cnf实现mysql客户端的字符集,配置方法如下。

[client]
Default-character-set=latin1
提示:不需要重启
[root@localhost ~]# sed -n "18,22p" /etc/my.cnf 
[client]
#password    = your_password
port        = 3306
socket        = /usr/local/mysql/tmp/mysql.sock
default-character-set = latin1
[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| 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/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

[client]

(3)修改完客户端字符集不用set查询表数据就不会乱码了

default-character-set=latin1

[root@localhost ~]# mysql -uroot -p123456 -e "select * from cuizhong.student;"
 ---- ----------- 
| id | name  |
 ---- ----------- 
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红|
|  8 | 不认识 |
|  9 | 李四|
 ---- ----------- 

提示:无需重启服务,退出重新登录就生效。此参数相当于,登录后执行set names latin1;

1.6.2 更改MySQL服务端字符集

[mysqld]

(1) 按下面要求修改my.cnf参数

character-set=latin1

[mysqld]
Default-character-set = latin1适合5.1及以前版本

提示:需要重启服务

(2) 修改前查看当前字符集

更改的参数是character_set_database和character_set_server

[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| Variable_name| Value|
 -------------------------- ---------------------------------- 
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
 -------------------------- ---------------------------------- 

说明:

(3) 查看修改的参数

default-character-set=gbk <=适合5.1及以前的版本

[root@localhost ~]# sed -n "26,27p" /etc/my.cnf 
[mysqld]
character-set-server = utf8

character-set-server=gbk <=适合5.5

(4) 重启mysql服务(生产环境是不允许重启的)

结论:

[root@localhost ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS!

不乱码的思想:建议中英文环境选择utf8

(5) 查看更改后的字符集

1、linux系统

[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| 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/share/charsets/ |
 -------------------------- ---------------------------------- 

#cat /etc/sysconfig/i18n

提示:以上在[mysqld]下设置的参数会更改下面2个参数的字符集设置。

LANG="zh_CN.utf8"

| Variable_name| Value|
| character_set_database   | utf8 |
| character_set_server | utf8 |

提示:linux客户端也要更改字符串,例如:SecureCRT->

这个时候我们再修改系统字符集mysql数据库字符集就不改了。

2、mysql客户端

[root@localhost ~]# cat /etc/sysconfig/i18n 
LANG="zh_CN.GB2312"
#LANG="zh_CN.UTF-8"
[root@localhost ~]# source /etc/sysconfig/i18n 
[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%';"
 -------------------------- ---------------------------------- 
| 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/share/charsets/ |
 -------------------------- ---------------------------------- 

临时:set names utf8;

1.6.3 统一mysql数据库客户端及服务端字符集总结

永久:更改my.cnf客户端模块的参数,可以实现set names utf8的效果,并且永久生效。

不乱码思想:建议中英文环境选择utf8 ,linux系统,客户端,服务端,库,表,程序字符集统一。

[client]

1.Linux系统字符集统一utf8

default-character-set=utf8

[root@localhost ~]# cat /etc/sysconfig/i18n 
LANG="zh_CN.UTF-8"

提示:无需重启服务,退出重新登录就生效,相当于set names utf8;

提示linux客户款也要更改字符集 例如:xshell

3.mysql数据库的服务端

图片 9

更改my.cnf

例如:SecureCRT

[mysqld]

图片 10

default-character-set=utf8 适合5.1及以前的版本

2.Mysql数据库客户端

character-set-server=utf8 适合5.5

临时:

4、mysql数据库中建库建表

Set names latin1

建库:create database oldboy DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci

永久:

建表:一般情况下,建库是指定字符集,表不用管

更改my.cnf客户端模块的参数,可以实现set names latin1效果,并永久生效。

create table student

3.服务端

(id int(4) not null auto_increment,

更改my.cnf参数

name char(20) not null,

[mysqld]
Default-character-set = latin1适合5.1及以前版本
character-set-server = latin1适合5.5

primary key(id )

4.库表,程序 指定字符集建库

)ENGINE= InnoDB AUTO_INCREMENT=10 DEFAULT CHARATERSET=UTF8;

Create database cuizhong_utf8 DEFAULT CHARACTER SET UTF8 COLLATE后面加校对规则

 

我们可以show一下查看支持的校对规则

更改生产线上Mysql数据字符集的方案

mysql> show character set;
 ---------- ----------------------------- --------------------- -------- 
| Charset  | Description | Default collation   | Maxlen |
 ---------- ----------------------------- --------------------- -------- 
| big5 | Big5 Traditional Chinese| big5_chinese_ci |  2 |
| dec8 | DEC West European   | dec8_swedish_ci |  1 |
| cp850| DOS West European   | cp850_general_ci|  1 |
| hp8  | HP West European| hp8_english_ci  |  1 |
| koi8r| KOI8-R Relcom Russian   | koi8r_general_ci|  1 |
| latin1   | cp1252 West European| latin1_swedish_ci   |  1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |  1 |
| swe7 | 7bit Swedish| swe7_swedish_ci |  1 |
| ascii| US ASCII| ascii_general_ci|  1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci|  3 |
| sjis | Shift-JIS Japanese  | sjis_japanese_ci|  2 |
| hebrew   | ISO 8859-8 Hebrew   | hebrew_general_ci   |  1 |
| tis620   | TIS620 Thai | tis620_thai_ci  |  1 |
| euckr| EUC-KR Korean   | euckr_korean_ci |  2 |
| koi8u| KOI8-U Ukrainian| koi8u_general_ci|  1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |  2 |
| greek| ISO 8859-7 Greek| greek_general_ci|  1 |
| cp1250   | Windows Central European| cp1250_general_ci   |  1 |
| gbk  | GBK Simplified Chinese  | gbk_chinese_ci  |  2 |
| latin5   | ISO 8859-9 Turkish  | latin5_turkish_ci   |  1 |
| armscii8 | ARMSCII-8 Armenian  | armscii8_general_ci |  1 |
| utf8 | UTF-8 Unicode   | utf8_general_ci |  3 |
| ucs2 | UCS-2 Unicode   | ucs2_general_ci |  2 |
| cp866| DOS Russian | cp866_general_ci|  1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |  1 |
| macce| Mac Central European| macce_general_ci|  1 |
| macroman | Mac West European   | macroman_general_ci |  1 |
| cp852| DOS Central European| cp852_general_ci|  1 |
| latin7   | ISO 8859-13 Baltic  | latin7_general_ci   |  1 |
| utf8mb4  | UTF-8 Unicode   | utf8mb4_general_ci  |  4 |
| cp1251   | Windows Cyrillic| cp1251_general_ci   |  1 |
| utf16| UTF-16 Unicode  | utf16_general_ci|  4 |
| cp1256   | Windows Arabic  | cp1256_general_ci   |  1 |
| cp1257   | Windows Baltic  | cp1257_general_ci   |  1 |
| utf32| UTF-32 Unicode  | utf32_general_ci|  4 |
| binary   | Binary pseudo charset   | binary  |  1 |
| geostd8  | GEOSTD8 Georgian| geostd8_general_ci  |  1 |
| cp932| SJIS for Windows Japanese   | cp932_japanese_ci   |  2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |  3 |
 ---------- ----------------------------- --------------------- -------- 
39 rows in set (0.00 sec)

更改数据库/表的字符集

5.开发程序的字符集

数据字符集修改步骤

简体UTF8

对于已有的数据库想修改字符集不能直接通过"alter database character set *"或“alter tablename character set *"这两个命令都没哟更新已有记录的字符集,而只是对新创建的表或者记录生效。

已经有记录的字符的调整,必须先将数据导出,讲过修改字符集后重新导入后才可完成。

1.7 如何更改生产MySQL数据库库表的字符集

1.导出表结构

数据字符集的修改步骤

msyqldump -uroot -p --default-character-set=latin1 -d dbname>alltable.sql

对于已有数据库想修改字符集不能直接通过“alter database character set ”或者”alter table tablename character set ”,这两个命令都没有更新已有数据的字符集。而只是对新创建的表或者数据生效。

--default-character-set=gbk表示以GBK字符集进行连接 -d 只导表结构

已经有记录的字符集的调整必须将数据导出,经过修改字符集之后重新导入才可完成。

 

修改数据库默认编码

2.编辑alltable.sql将latin1改成GBK

Alter database [your db name] charset [your character setting]

3.确保数据库不再更新,,导出所有数据

下面模拟将latin1字符集的数据库修改成GBK字符集的过程。

mysqldump -uroot -p --quick --no-create-info --extended-insert --default-charater-set=latin1 dbname>alldata.sql

(1)导出表结构

参数说明:

Mysqldump –uroot –p123456 –-default-character-set=latin1 –d dbname>alltable1.sql –-default-character-set=gbk 表示以GBK字符集进行连接 –d只导表结构。

--quick:用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行,并输出前CACHE到内存中

(2)然后编辑alltable.sql将latin1用sed替换成GBK

--no-create-info:不创建CREATE TABLE语句

(3)确保数据不在更新导出所有数据

--extended-insert:使用包括几个VALUES列表的多行INSERT语法,这样文件更小,IO也小,导入数据时会非常快

Mysqldmup –uroot –p123456 –-quick –-no-create-info –-extended-insert –-default-character-set=latin1 dbname>alltable.sql

--default-charater-set=latin1 #按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码

参数说明:

4.打开alldata.sql将set names latin1修改成 set names GBK;(或者修改系统的服务端和客户端)

--quick:用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行并输出前CACHE到内存中。

5.建库

--no-create-info:不创建CREATE TABLE 语句。

create database dbname default charset gbk;

--extended-insert:使用包括几个VALUES列表的多行INSERT语法,这样文件更小,IO也小导入数据是非常快。

6.创建表,执行alltable.sql

--default-character-set=latin1按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码。

mysql -uroot -p dbname<alltable.sql

(4)打开alltable.sql将set names latin1修改成set names gbk(或者修改系统的服务端和客户端)

7.导入数据

(5)建库

mysql -uroot -p dbname<alldata.sql

Create database dbname default charset gbk;

 

(6)创建表执行,alltable1.sql

总结:Latin1->utf8

Mysql –uroot –p123456 dbname<alltable1.sql

1、建库及建表的语句导出,sed批量修改为utf8

(7)导入数据

2、导出所有数据

Mysql –uroot –p123456 dbname<alltable.sql

3、修改mysql服务端和客户端编码为utf8

总结:latin1改成utf8

4、删除原有的库表及数据

(1)建库及建表的语句导出,sed批量修改为utf8。

5、导入建库及建表的语句

(2)导出所有数据。

6、导入mysql的所有数据

(3)修改mysql服务端和客户端编码为utf8。

 

(4)删除原有的库表及数据。

 

(5)导入新的建库建表的语句。

 

(6)导入mysql的所有数据。

 

 

 

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:MySQL乱码管理及字符集相关介绍,mysql基础运行

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。