赞
踩
本文以Windows下操作为例,Linux也是一样的方法,区别在于路径语法不同而已~
创建一个MySQL数据库test
和数据表demo_info
,方便进行测试~
create database if not exists test default character set utf8 collate utf8_general_ci; use test; -- 创建测试表 create table test.demo_info( id int(7) primary key not null auto\_increment, name varchar(255) not null, sex char(1) not null, age int(3) )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; alter table test.demo_info comment '测试表'; alter table test.demo_info modify column id int(7) not null auto\_increment comment 'ID'; alter table test.demo_info modify column name varchar(255) not null comment '姓名'; alter table test.demo_info modify column sex char(1) not null comment '性别:1-男,0-女'; alter table test.demo_info modify column age int(3) comment '年龄';
(1)准备insert.sql
内容如下:
use test;
insert into test.demo_info(name,sex,age) values('张一','1',21);
insert into test.demo_info(name,sex,age) values('张二','0',22);
insert into test.demo_info(name,sex,age) values('张三','1',23);
**存放路径:**C:/Users/Administrator/Desktop/insert.sql
(2)先登录到MySQL命令行
打开cmd命令窗口,登录到MySQL命令行:
$ cd C:\Program Files\MySQL\MySQL Server 5.7\bin
$ mysql -hlocalhost -uroot -p --default-character-set=utf8
输入密码:
mysql >
(3)执行source
命令导入数据:
mysql> use test;
mysql> show tables;
mysql> select * from demo_info;
mysql> source C:/Users/Administrator/Desktop/insert.sql;
注意如果你数据库没有设置字符集为utf8,并且在连接时也没有指定--default-character-set=utf8
连接,那么会导致插入中文数据时乱码,提示如下:
乱码原因是,默认客户端连接编码为GBK
mysql> use test;
mysql> show variables like '%character%';
中文乱码情况的解决方案,如果不想在连接时指定字符集为utf8,可以修改mysql的配置my.ini(my.cnf)
指定字符集为utf8,重启mysql服务生效~
[client]
default-character-set=utf8
[mysql]
character-set-server=utf8
[mysqld]
default-character-set=utf8
命令source
导出数据主要是通过执行导出数据的SQL语句,本质还是使用into outfile
语法来实现,这里先简单直接使用下~
(1)准备select.sql
内容如下:
use test;
select \* from test.demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info.txt';
**select.sql
存放路径:**C:/Users/Administrator/Desktop/select.sql
(2)执行source
命令导出数据:
mysql> source C:/Users/Administrator/Desktop/select.sql;
不过,别高兴太早,一般都会报错的,提示如下:
ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement
原因是--secure-file-priv
安全路径问题,具体往下进入到into outfile
章节了解~
导出数据通过into outfile语法实现,导入数据通过load data infile语法实现~
(1)前提条件说明
授权用户file权限:
mysql > select * from mysql.user where user='root' \G;
mysql > update mysql.user set File_priv='Y' where user='root';
mysql > select * from mysql.user where user='root' \G;
mysql > flush privileges;
如果没有授予用户的File_priv
权限为Y
,into outfile导出文件时会报错:
ERROR 1 (HY000): Can’t create/write to file ‘C:\Users\Administrator\Desktop\demo_info.txt’ (Errcode: 13 - Permission denied)
配置安全路径:
MySQL使用
into outfile
语法导出数据时,只能导出数据文件到secure-file-priv
指定的安全路径下~
查看安全路径命令mysql>show variables like '%secure%';
可以看到参数secure_file_priv
对应的路径即为MySQL安全路径:
但是Windows
下路径问题,有一个小坑,容易误导人,就是这里show
显示的路径是单反斜杠\
,但实际用的时候要么变成双反斜杠\\
,要么改成单斜杠/
,才能使用into outfile
语法正常导出,否则会报错~
如果指定导出文件路径不是安全路径下的,则会报错:
ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement
简单导出测试下(非安全路径,如桌面):
select \* from test.demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info.txt';
报错提示如下:
简单导出测试下(安全路径)
select \* from test.demo_info into outfile 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/demo\_info.txt';
正常导出demo_info.txt
数据文件(注意Windows下路径不要用单反斜杠\
)
(2)配置安全路径
如果不想用默认安全路径,可以修改参数--secure-file-priv
为自定义路径,修改MySQL配置文件,一般默认的配置文件路径为:
Windows:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
Linux:/etc/my.cnf
安全路径在[mysqld]组下找到参数secure_file_priv
进行配置即可~
这里我修改为空字符串""
:
secure-file-priv=""
空字符串""
表示不限制导出路径,不过需要是mysql用户有读写权限的目录,例如Linux下,你不能直接导出到/root/
目录下,肯定是没权限创建数据文件的~~
(3)导出数据
简单导出测试:
select \* from test.demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info.txt';
发现导出到桌面居然不成功,其他MySQL安装目录和D盘都可以,C盘下都不行~
解决方案是按快捷键:Win
快速搜索:服务
关键字,找到mysql服务,右键查看属性~
切换账户为本地系统账户
并勾选允许服务与桌面交互
~
应用并重启mysql服务生效~
重新简单导出测试,导出到桌面成功:
select \* from test.demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info.txt';
通过前面简单导出数据得到数据文件demo_info.txt
,可以看到导出的数据占用的空间比较大
7 张一 1 21
8 张二 0 22
9 张三 1 23
如果字段的数据比较长,数据量比较大,会很浪费空间,因此需要对into outfile导出的数据文件进行格式化:
(1)MySQL命令行>
select \* from demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info.del' character set utf8 fields terminated by 0x0f;
导出的数据空间完全紧密,不浪费任何空间,实际使用这种方式的非常多:
(2)终端命令行:
mysql -hlocalhost -uroot -p test -e "select \* from test.demo\_info into outfile 'C:/Users/Administrator/Desktop/demo\_info.del' character set utf8 fields terminated by 0x0f"
into outfile参数说明:
参数 | 说明 |
---|---|
character set utf8 | 字符集utf8 ,防止中文乱码,需要放在fields 前面,否则报错 |
fields | 域,后面常用字段有terminated /optionally /escaped |
terminated by 'string' | 设置字段数据之间的分隔符,如最常用的分隔符0x0f |
optionally enclosed by 'char' | 设置字段非数值的数据,使用什么符号引起,如英文双引号" |
escaped by 'char' | 字段数据存在特殊符号使用的转移符,默认是反斜杠\ ,如还可以指定为双引号" |
lines | 设置每条记录的开头starting 和结尾字符terminated |
lines starting by 'char' | 设置每条记录的开头字符,默认空字符串'' |
lines terminated by 'char' | 设置每条记录的结尾字符默认换行符'\n' |
使用enclosed by
参数示例:
select \* from demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info2.del' character set utf8 fields terminated by 0x0f optionally enclosed by '"';
使用escaped by
参数示例:
例如,把张三的名字后面加个特殊符号换行符\n
update test.demo_info set name='张一\n' where id=7;
再执行导出命令:
select \* from test.demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info3.del' character set utf8 fields terminated by 0x0f optionally enclosed by '"' escaped by '"';
使用lines
参数示例:
update test.demo_info set name='张一' where id=7;
select \* from test.demo_info into outfile 'C:/Users/Administrator/Desktop/demo\_info4.del' character set utf8 fields terminated by 0x0f optionally enclosed by '"' escaped by '"' lines terminated by 'end\n' starting by 'start ';
观察每条记录的首尾数据格式:
(1)存在问题:
Linux环境下,由于使用MySQL语法into outfile
导出的数据文件时,数据文件只能保存在MySQL数据库服务端,那么会导致在集群模式下,当应用和数据库分别部署在两台不同的服务器时,会存在应用无法读取到数据文件的问题~
MySQL服务器M:/batchfile/mysql/data/test/demo_info.del;
应用服务器A: 批量程序,可能会通过shell脚本想要加载demo_info.del
数据文件~
应用服务器B: 批量程序,可能会通过shell脚本想要加载demo_info.del
数据文件~
(2)解决方案:
可以通过mount
挂在指定目录/batchfile/
为共享盘目录,实现服务器A、B、M都能拥有该目录下的数据文件的读写访问权限~
具体mount
命令的使用方式,可以查询百度学习下~
(1)数据文件
前面通过into outfile简单导出得到demo_info.txt:
7 张一 1 21
8 张二 0 22
9 张三 1 23
(2)导入数据
load data infile 'C:/Users/Administrator/Desktop/demo\_info.txt' into table demo_info character set utf8;
导入del数据文件(加载服务端文件):
命令行mysql>
load data infile 'C:/Users/Administrator/Desktop/demo\_info.del' into table demo_info character set utf8 fields terminated by 0x0f;
load data infile参数说明:
参数 | 说明 |
---|---|
character set utf8 | 字符集utf8 ,防止中文乱码,需要放在fields 前面,否则报错 |
fields | 域,后面常用字段有terminated /optionally /escaped |
terminated by 'string' | 设置字段数据之间的分隔符,如最常用的分隔符0x0f |
optionally enclosed by 'char' | 设置字段非数值的数据,使用什么符号引起,如英文双引号" |
escaped by 'char' | 字段数据存在特殊符号使用的转移符,默认是反斜杠\ ,如还可以指定为双引号" |
lines | 设置每条记录的开头starting 和结尾字符terminated |
lines starting by 'char' | 设置每条记录的开头字符,默认空字符串'' |
lines terminated by 'char' | 设置每条记录的结尾字符默认换行符'\n' |
(字段1,字段2,字段3) | 指定字段导入数据,注意放在整个语句最后,放前面,会报错 |
其实除了指定字段的参数
,其他参数大多只需要跟into outfile
导出参数一样,导出时有的参数,load data infile导入时该有的参数也加上就好~
比如into outfile
导出最复杂的情况如下(分隔符为0x0f
、非数值双引号"
扩起、特殊转义符使用双引号"
转义、每条记录开头是start
及结尾是end\n
)得到数据文件demo_info_complex_data.del
学习视频:
大厂面试真题:
es terminated by ‘char’ | 设置每条记录的结尾字符默认换行符
’\n’| |
(字段1,字段2,字段3)` | 指定字段导入数据,注意放在整个语句最后,放前面,会报错 |
其实除了指定字段的参数
,其他参数大多只需要跟into outfile
导出参数一样,导出时有的参数,load data infile导入时该有的参数也加上就好~
比如into outfile
导出最复杂的情况如下(分隔符为0x0f
、非数值双引号"
扩起、特殊转义符使用双引号"
转义、每条记录开头是start
及结尾是end\n
)得到数据文件demo_info_complex_data.del
学习视频:
[外链图片转存中…(img-ZCTRcq8O-1714423231376)]
大厂面试真题:
[外链图片转存中…(img-oD6Yxxt4-1714423231377)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。