设为首页 收藏本站
查看: 567|回复: 0

[经验分享] mysql中的中文乱码处理

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-4-8 14:18:05 | 显示全部楼层 |阅读模式
备注:来自老男孩课程的学习总结

1、MySQL中添加中文数据乱码演示
a. 创建一个oldboy测试数据库并查看建表语句
模拟创建一个默认的字符集数据库
1
create database oldboy default character set latin1 collate latin1_swedish_ci;



spacer.jpg
2 创建一个表
1
mysql> create table student ( id int(4) not null auto_increment, name char(20) not null, primary key(id) );



3 插入数据--插入一个应为一个中文
spacer.jpg
因为库是拉丁字符集所以表默认也是拉丁字符集
spacer.jpg
1
2
insert into student values (1,'jack');
insert into student values (2,'中文名字');




spacer.jpg
4 思考
为什么插入中文数据就乱码呢
又如何解决插入中文数据乱码问题呢 带着这两个问题见下文
5 MySQL命令行 插入中文数据不乱码实战
5.1 查看建表语句
1
2
3
4
5
6
7
8
9
mysql> show create table student\G;
*************************** 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=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)



5.2 设置MySQL客户端的字符集和建表的字符集latin1 一致
1
2
mysql> set names latin1;    #<----设置字符集为插入数据表的字符集然后插入中文数据测试
mysql> insert into student values (3,'中文名字');



spacer.jpg
但是老的数据依然是乱码没解决
6 执行SQL文件插入中国数据不乱码实战
6.1 将要更新的多个sql语句放到文本文件文件中里如test.sql所示
1
2
3
mysql> system cat /tmp/test.sql
set names latin1;
INSERT INTO student VALUES (8,'老男孩');




提示:务必需加入set names latins;确保插入数据不乱码

6.2 在MySQL命令行通过source调用test.sql文件掺入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> source /tmp/test.sql   
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.04 sec)
mysql> select * from student;         
+----+--------------+
| id | name         |
+----+--------------+
|  1 | jack         |
|  2 | ????         |
|  3 | 中文名字     |
|  8 | 老男孩       |
+----+--------------+
4 rows in set (0.00 sec)




小结:
1 DQL DML语句之前set names 系统及库表的字符集!
7 通过MySQL命令加字符集参数导入数据解决乱码
7.1 把要跟新的多个SQL语句放入文本文件中注意此次语句里不带set names latin1;
[iyunv@log_server src]# cat /tmp/test.sql   
1
INSERT INTO student VALUES (9,'张三');





7.2 通过MySQL命令加上字符集参数指定latin1 字符集导入test.sql语句
1
2
3
[
root@log_server
src]# mysql -uroot -p12qwaszx -S /data/3307/mysql.sock  --default-character-set=latin1 oldboy < /tmp/test.sql;





通过-e 参数在mysql库外查看结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[iyunv@log_server src]# mysql -uroot -p12qwaszx -S /data/3307/mysql.sock   -e " set names latin1; select * from oldboy.student"
+----+--------------+
| id | name         |
+----+--------------+
|  1 | jack         |
|  2 | ????         |
|  3 | 中文名字     |
|  8 | 老男孩       |
|  9 | 张三         |
+----+--------------+
[iyunv@log_server src]# mysql -uroot -p12qwaszx -S /data/3307/mysql.sock   -e "select * from oldboy.student"                  
+----+-----------------------------+
| id | name                        |
+----+-----------------------------+
|  1 | jack                        |
|  2 | ????                        |
|  3 | -–-—                |
|  8 | è”·-                   |
|  9 |  ‰                      |
+----+-----------------------------+





8 在my.cnf 配置文件中永久指定 同一字符集
更改my.cnf客户端模块可以实现set name latin1 的效果并且永久生效
[client]
default-character-set=latin1
提示: 无需重启服务退出重新登入就生效相当于 set names latin1;


更改服务端字符集的简单的办法:
更改my.cnf参数
[mysqld]
default-character-set=latin1  适合5.1及以前版本
character-set-server=latin1   适合5.5
不乱码思想,linux系统、客服端、服务端、库表、程序字符集要统一
建议中英文使用utf8

linux系统
[iyunv@log_server ~]# cat /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
MySQL客户端:
临时
set name latin1;
永久
[client]
default-character-set=latin1
服务端:
[mysqld]
default-character-set=latin1  适合5.1及以前版本
character-set-server=latin1 适合5.5

库表 随服务端或者建库手工create database指定或编译安装的时候指定
查校对规则
show character set; 有默认的校对规则

show create database oldboy;
程序
如SecureCRT程序的选项设置的字符集




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-201488-1-1.html 上篇帖子: mysql主从延迟设置 下篇帖子: mysql 行锁的实现 mysql 中文
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表