source命令执行sql脚本在DOS界面出现中文乱码问题

本文介绍了在DOS环境下执行SQL脚本时遇到的中文乱码问题及其解决方案。问题主要分为两类:插入数据时的编码不匹配和查询结果显示乱码。解决方案包括将SQL脚本保存为ANSI编码并使用setnames gbk,或者保持脚本为UTF8编码并配合setnames utf8。文章提供了详细的步骤和示例SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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语句
/*注意脚本文件要保存成ANSI编码格式的文件*/
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格式)
/*脚本sql文件为.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;

在处理SQL脚本中的数据乱码问题时,有几种方法可以尝试解决。 首先,可以尝试在导入SQL文件时指定字符集。使用--default-character-set参数来指定字符集,例如: mysql -hlocalhost -P3306 -uroot -p123456 -Dtest --default-character-set=utf8 < test.sql \[2\]。这样可以确保在导入数据时使用正确的字符集。 其次,如果在插入中文字符时出现乱码,可以在中文字符串前面加上一个大写字母N。例如: insert into promary values(1,N'北京市') \[3\]。这样可以告诉数据库该字符串是Unicode编码,以避免乱码问题。 另外,还可以尝试将SQL文件放置在Scripts文件夹中进行导入,这样可以避免乱码问题。其他位置可能仍然会出现乱码。 总结起来,解决SQL脚本数据乱码问题的方法包括指定字符集、在插入中文字符时加上大写字母N,并将SQL文件放置在Scripts文件夹中进行导入。希望这些方法能够帮助到你解决问题。 #### 引用[.reference_title] - *1* [DBeaver打开sql脚本中文乱码](https://blog.youkuaiyun.com/qq_39390482/article/details/120956355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [mysql 导入SQL脚本乱码处理](https://blog.youkuaiyun.com/thlzjfefe/article/details/124107244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SQL Server插入中文数据出现乱码问题](https://blog.youkuaiyun.com/sdhongjun/article/details/84194746)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值