mysql字符乱码

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

1)MySQL插入中文数据乱码问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
模拟乱码现象:
mysql> create database kitty;
Query OK, 1 row affected (0.00 sec)
mysql> show create database kitty\G;
*************************** 1. row ***************************
        Database: kitty
Create Database: CREATE DATABASE `kitty` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row  in  set  (0.00 sec)
ERROR: 
No query specified
mysql> alter database kitty character  set  latin1;
Query OK, 1 row affected (0.01 sec)
mysql> flush privileges;
mysql> use kitty;
Database changed
创建teacher表(字符集为latin1):
CREATE TABLE `teacher` (
   ` id ` int(4) NOT NULL,
   `name` char(20) NOT NULL,
   `age` tinyint(2) NOT NULL DEFAULT  '0' ,
   `dept` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
插入两条数据,其中一行带有中文字符
mysql> insert into teacher values(1, 'wanlong' , '31' , 'Server' ),(2, 'laomao' , '31' , '售后部' );
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 se
查看发现有乱码出现:
mysql>  select  * from teacher;
+----+---------+-----+--------+
id  | name    | age | dept   |
+----+---------+-----+--------+
|  1 | wanlong |  31 | Server |
|  2 | laomao  |  31 | ???    |
+----+---------+-----+--------+
2 rows  in  set  (0.00 sec)

2) 如何解决乱码了

不乱码的思想:建议中英文混合的环境,选择utf-8

客户端:

set names utf8(临时生效)

修改my.cnf(永久生效)

[client]

default-character-set=utf8


服务端-库-表-程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
服务端:
[mysqld]
default-character- set =utf8(适合5.1及以前的版本)
character- set -server=utf8(适合5.5)
库:
查看数据库的编码:
mysql> show variables like '%char%' ;
+--------------------------+-------------------------------------------+
| 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       |  /application/mysql-5 .5.32 /share/charsets/  |
+--------------------------+-------------------------------------------+
8 rows  in  set  (0.00 sec)
表:
查看表的编码:
mysql> show create table teacher\G;
*************************** 1. row ***************************
        Table: teacher
Create Table: CREATE TABLE `teacher` (
   ` id ` int(4) NOT NULL,
   `name` char(20) CHARACTER SET latin1 NOT NULL,
   `age` tinyint(2) NOT NULL DEFAULT  '0' ,
   `dept` varchar(16) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row  in  set  (0.00 sec)
ERROR: 
No query specified
mysql>  select  * from teacher;
+----+---------+-----+--------+
id  | name    | age | dept   |
+----+---------+-----+--------+
|  1 | wanlong |  31 | Server |
|  2 | laomao  |  31 | ???    |
|  3 | kobe    |  35 | ???    |
+----+---------+-----+--------+
3 rows  in  set  (0.00 sec)
mysql> show create table teacher\G;
*************************** 1. row ***************************
        Table: teacher
Create Table: CREATE TABLE `teacher` (
   ` id ` int(4) NOT NULL,
   `name` char(20) CHARACTER SET latin1 NOT NULL,
   `age` tinyint(2) NOT NULL DEFAULT  '0' ,
   `dept` varchar(16) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row  in  set  (0.00 sec)
ERROR: 
No query specified
修改字段的字符集:
mysql> alter table `teacher` change `dept` `dept` varchar(16) CHARACTER SET utf8 NOT NULL;
mysql> alter table `teacher` change `name` `name` char(20) CHARACTER SET utf8 NOT NULL;
mysql> show full columns from teacher;
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+--
| Field | Type        | Collation       | Null | Key | Default | Extra | Privileges                      | C
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+--
id     | int(4)      | NULL            | NO   |     | NULL    |       |  select ,insert,update,references |  
| name  | char(20)    | utf8_general_ci | NO   |     | NULL    |       |  select ,insert,update,references |  
| age   | tinyint(2)  | NULL            | NO   |     | 0       |       |  select ,insert,update,references |  
| dept  | varchar(16) | utf8_general_ci | NO   |     | NULL    |       |  select ,insert,update,references |  
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+--
4 rows  in  set  (0.00 sec)
mysql>  select  * from teacher;
+----+---------+-----+--------+
id  | name    | age | dept   |
+----+---------+-----+--------+
|  1 | wanlong |  31 | Server |
|  2 | laomao  |  31 | ???    |
|  3 | kobe    |  35 | ???    |
+----+---------+-----+--------+
3 rows  in  set  (0.00 sec)
测试再次插入带有中文字符的字段:
mysql> insert into teacher values(4, '万龙' ,30, '校园网' ),(5, '知行' ,29, '华东院' );
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql>  select  * from teacher;
+----+---------+-----+-----------+
id  | name    | age | dept      |
+----+---------+-----+-----------+
|  1 | wanlong |  31 | Server    |
|  2 | laomao  |  31 | ???       |
|  3 | kobe    |  35 | ???       |
|  4 | 万龙    |  30 | 校园网    |
|  5 | 知行    |  29 | 华东院    |
+----+---------+-----+-----------+
5 rows  in  set  (0.00 sec)


3)老数据仍旧是乱码!

说明:

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


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

修改数据库默认编码:

“alter database kitty character set *”


4)参考解决方法:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、导出表结构
mysqldump -uroot -predhat12345 -S  /data/3306/mysql .sock --default-character- set =latin1 -d kitty>kittytable.sql
说明:-d只导表结构
2、编辑kittytable.sql,将lantin1改成utf8
可以用 sed 批量修改
3、确保数据库不再更新,导出所有数据
mysqldump -uroot -predhat12345 -S  /data/3306/mysql .sock --quick --no-create-info --extended-insert --default-character- set =latin1 kitty>kittydata.sql
4、打开kittydata.sql,将 set  names latin1修改成 set  names utf8
5、删除原有的库表及数据(需要慎重)
6、建库
create database kitty default charset utf8;
7、创建表,执行kittytable.sql
mysql -uroot -predhat12345 -S  /data/3306/mysql .sock kitty<kittytable.sql
8、导入数据
mysql -uroot -predhat12345 -S  /data/3306/mysql .sock kitty<kittydata.sql


5)执行SQL文件插入中文数据不乱码实战:

a、将需要更新的sql语句放到文本文件中

1
2
3
mysql> system  cat  test .sql
set  names utf8;
insert into teacher values (6, '张飞' ,45, '商务部' );

b、通过source来调用sql文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql>  source  test .sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.01 sec)
mysql>  select  * from teacher;
+----+---------+-----+-----------+
id  | name    | age | dept      |
+----+---------+-----+-----------+
|  1 | wanlong |  31 | Server    |
|  2 | laomao  |  31 | ???       |
|  3 | kobe    |  35 | ???       |
|  4 | 万龙    |  30 | 校园网    |
|  5 | 知行    |  29 | 华东院    |
|  6 | 张飞    |  45 | 商务部    |
+----+---------+-----+-----------+
6 rows  in  set  (0.00 sec)









本文转自 冰冻vs西瓜 51CTO博客,原文链接:http://blog.51cto.com/molewan/1862982,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 关系型数据库 MySQL
MySQL 字符字段长度设置详解:语法、注意事项和示例
MySQL 字符字段长度设置详解:语法、注意事项和示例
282 0
|
4月前
|
关系型数据库 MySQL
MySQL——删除指定字符
MySQL——删除指定字符
49 1
|
5月前
|
关系型数据库 MySQL
mysql模糊查询指定根据第几个字符来匹配
mysql模糊查询指定根据第几个字符来匹配
239 1
|
7月前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
6月前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之在数据集成到MySQL时,遇到特殊字符导致的脏数据如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
7月前
|
关系型数据库 MySQL
Mysql 查询以某个字符开头的语句和LIKE的使用
Mysql 查询以某个字符开头的语句和LIKE的使用
142 0
|
JSON 关系型数据库 MySQL
MySQL的字符转义
MySQL的字符转义
56 0
|
关系型数据库 MySQL 数据库
60【MySQL】MySQL存不了字符引发的折腾
【MySQL】MySQL存不了字符引发的折腾
72 0
|
关系型数据库 MySQL
MySQL实战基础知识入门(5):命令行汉字中文输出乱码的解决方案
MySQL实战基础知识入门(5):命令行汉字中文输出乱码的解决方案
92 0
|
存储 关系型数据库 MySQL
MySQL中字符、字节、位之间的关系
MySQL中字符、字节、位之间的关系
117 0