标签:mysql 中文乱码
备注:来自老男孩课程的学习总结
1、MySQL中添加中文数据乱码演示
a. 创建一个oldboy测试数据库并查看建表语句
模拟创建一个默认的字符集数据库
create database oldboy default character set latin1 collate latin1_swedish_ci;
2 创建一个表
mysql> create table student ( id int(4) not null auto_increment, name char(20) not null, primary key(id) );
3 插入数据--插入一个应为一个中文
因为库是拉丁字符集所以表默认也是拉丁字符集
insert into student values (1,‘jack‘); insert into student values (2,‘中文名字‘);
4 思考
为什么插入中文数据就乱码呢
又如何解决插入中文数据乱码问题呢 带着这两个问题见下文
5 MySQL命令行 插入中文数据不乱码实战
5.1 查看建表语句
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 一致
mysql> set names latin1; #<----设置字符集为插入数据表的字符集然后插入中文数据测试 mysql> insert into student values (3,‘中文名字‘);
但是老的数据依然是乱码没解决
6 执行SQL文件插入中国数据不乱码实战
6.1 将要更新的多个sql语句放到文本文件文件中里如test.sql所示
mysql> system cat /tmp/test.sql set names latin1; INSERT INTO student VALUES (8,‘老男孩‘);
提示:务必需加入set names latins;确保插入数据不乱码
6.2 在MySQL命令行通过source调用test.sql文件掺入数据
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;
[root@log_server src]# cat /tmp/test.sql
INSERT INTO student VALUES (9,‘张三‘);
7.2 通过MySQL命令加上字符集参数指定latin1 字符集导入test.sql语句
[ root@log_server src]# mysql -uroot -p12qwaszx -S /data/3307/mysql.sock --default-character-set=latin1 oldboy < /tmp/test.sql;
通过-e 参数在mysql库外查看结果
[root@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 | 张三 | +----+--------------+ [root@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系统
[root@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程序的选项设置的字符集
x
本文出自 “崔德华运维打工从业路” 博客,请务必保留此出处http://cuidehua.blog.51cto.com/5449828/1761475
标签:mysql 中文乱码
原文地址:http://cuidehua.blog.51cto.com/5449828/1761475