source命令执行sql脚本在DOS界面出现中文乱码问题
1 问题出现的形式
1.1 插入不进去中文(1366问题)
1.1.1 错误示例图
1.1.2 原因
因为你文件是以utf8格式进行编写的,导入的时候,会默认以ansi/gbk的格式进行指令的执行,表结构你又设置的字符集又是utf8,表里面的所有字段都会以utf8格式进行存储而你是以ansi/gbk进行输入的,两种编码都不匹配,自然会出现编码的异常了
总结:要求插入时的脚本的字符集要与数据库定义的字符集保持一致,
1.2 能插入中文,但是查询的时候会显示乱码
1.2.1 错误示例图
1.2.2 原因
因为你再INSERT INTO前执行了set names utf8语句
那么他就会把文件的插入指令以utf8的形式去读取执行
你的表结构设置的是utf8格式,字段也自然都是utf8格式
那么插入的时候会成功,不会报错
但是因为dos界面默认是ansi/gbk格式进行展示的
因此你在展示的过程中就需要使用set names gbk让其能正常显示
总结:想要在DOS界面正常显示中文,在脚本的插入数据前加上set name utf8,在插入完成所有的数据后
再一次set names gbk;
2 解决问题的两种思路
2.1 更改sql脚本的格式的保存格式为ANSI编码
2.1.1 使得sql脚本的编码改为ANSI编码
2.1.2 在插入语句前设置set names gbk格式
2.1.3 脚本运行截图
2.1.4 脚本sql语句
DROP DATABASE IF EXISTS temp02;
CREATE DATABASE IF NOT EXISTS `temp02` CHARACTER SET utf8;
use temp02;
CREATE TABLE IF NOT EXISTS `my_class`(
`cid` int(10) auto_increment comment '班级id',
`cno` VARCHAR(30) NOT NULL DEFAULT '*' UNIQUE comment '班级编号',
`cname` VARCHAR(255) NOT NULL DEFAULT '*' UNIQUE comment '班级名称',
PRIMARY KEY(cid)
);
CREATE TABLE IF NOT EXISTS `my_student`(
`sid` int(10) auto_increment comment '学生id',
`sno` VARCHAR(30) NOT NULL DEFAULT '*' UNIQUE comment '学生学号',
`sname` VARCHAR(30) NOT NULL DEFAULT '*' comment '学生姓名',
`cno` VARCHAR(30) NOT NULL DEFAULT '*' comment '班级编号',
PRIMARY KEY(sid),
FOREIGN KEY(cno) references my_class(cno)
);
set names gbk;
INSERT INTO my_class (cno,cname) VALUES ('sdfz2001','师大附中高一1班');
INSERT INTO my_class (cno,cname) VALUES ('csyz2002','长沙一中高二2班');
INSERT INTO my_class (cno,cname) VALUES ('cq2003','长郡中学高三3班');
INSERT INTO my_student (sno,sname,cno) VALUES ('200110','张三','sdfz2001');
INSERT INTO my_student (sno,sname,cno) VALUES ('200117','李四','sdfz2001');
INSERT INTO my_student (sno,sname,cno) VALUES ('200210','张三','csyz2002');
INSERT INTO my_student (sno,sname,cno) VALUES ('200217','李四','csyz2002');
INSERT INTO my_student (sno,sname,cno) VALUES ('200310','张三','cq2003');
INSERT INTO my_student (sno,sname,cno) VALUES ('200317','李四','cq2003');
SELECT * FROM my_class;
SELECT * FROM my_student;
2.2 更改脚本文件类型(.sql)为utf8的编码格式
2.2.1 是得sql脚本的编码改为UTF8编码
2.2.2 插入语句前set names utf8,保证文件类型和指令执行的类型保持一致
2.2.3 插入语句完成后set names gbk,保证dos界面(控制台)能正常显示
2.2.4 脚本运行截图
2.2.5脚本sql语句(文件需要保存为UTF8格式)
DROP DATABASE IF EXISTS temp02;
CREATE DATABASE IF NOT EXISTS `temp02` CHARACTER SET utf8;
use temp02;
CREATE TABLE IF NOT EXISTS `my_class`(
`cid` int(10) auto_increment comment '班级id',
`cno` VARCHAR(30) NOT NULL DEFAULT '*' UNIQUE comment '班级编号',
`cname` VARCHAR(255) NOT NULL DEFAULT '*' UNIQUE comment '班级名称',
PRIMARY KEY(cid)
);
CREATE TABLE IF NOT EXISTS `my_student`(
`sid` int(10) auto_increment comment '学生id',
`sno` VARCHAR(30) NOT NULL DEFAULT '*' UNIQUE comment '学生学号',
`sname` VARCHAR(30) NOT NULL DEFAULT '*' comment '学生姓名',
`cno` VARCHAR(30) NOT NULL DEFAULT '*' comment '班级编号',
PRIMARY KEY(sid),
FOREIGN KEY(cno) references my_class(cno)
);
set names utf8;
INSERT INTO my_class (cno,cname) VALUES ('sdfz2001','师大附中高一1班');
INSERT INTO my_class (cno,cname) VALUES ('csyz2002','长沙一中高二2班');
INSERT INTO my_class (cno,cname) VALUES ('cq2003','长郡中学高三3班');
INSERT INTO my_student (sno,sname,cno) VALUES ('200110','张三','sdfz2001');
INSERT INTO my_student (sno,sname,cno) VALUES ('200117','李四','sdfz2001');
INSERT INTO my_student (sno,sname,cno) VALUES ('200210','张三','csyz2002');
INSERT INTO my_student (sno,sname,cno) VALUES ('200217','李四','csyz2002');
INSERT INTO my_student (sno,sname,cno) VALUES ('200310','张三','cq2003');
INSERT INTO my_student (sno,sname,cno) VALUES ('200317','李四','cq2003');
set names gbk;
SELECT * FROM my_class;
SELECT * FROM my_student;
|