mysql数据库初识基本用法数据引擎(一)

一、MySQL的相关概念介绍

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。

MySQL规范

  • 在数据库系统中 , SQL语句不区分大小写 (建议用大写) , 但字符串常量区分大小写 ; 建议命令大写 , 表名库名小写
  • SQL语句可单行或多行书写 , 以" ; "结尾 , 关键字不能跨多行或简写
  • 用空格和缩进来提高语句的可读性 , 子句通常位于独立行 , 便于编辑 , 提高可读性
  • 单行注释 : -- 多行注释 : / *... */
  • SQL语句可拆行操作

二、MySQL中的数据类型

MySQL有三大类数据类型, 分别为数字、日期\时间、字符串, 这三大类中又更细致的划分了许多子类型:

  • 数字类型

    • 整数: tinyint、smallint、mediumint、int、bigint
    • 浮点数: float、double、real、decimal
  • 日期和时间: date、time、datetime、timestamp、year

  • 字符串类型

    • 字符串: char、varchar
    • 文本: tinytext、text、mediumtext、longtext
    • 二进制(可用来存储图片、音乐等): tinyblob、blob、mediumblob、longblob

这里不能详细对这些类型进行介绍了, 篇幅可能会很长, 详细介绍参见: 《MySQL数据类型》 :http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html

mysql安装

# 路径
        # 1.路径不能有中文
        # 2.路径中不能有特殊字符
    # 修改配置文件
        # 1.编码utf-8
        # 2.所有的配置项后面不要有特殊的符号
        # 3.修改两个路径basedir datadir
    # 检测文件的扩展名设置
        # 工具-->文件夹选项-->查看-->扩展名 不要隐藏
    # 配置环境变量
        # 在path中添加
            # C:\mysql\mysql-5.6.45-winx64\bin
    # 以管理员的身份重新打开一个cmd
        # mysqld install 安装成功
    # 启动mysql
        # net start mysql 启动mysql server
    # 在cmd启动mysql 客户端
        # mysql
        # 客户端和本地的mysql server相连

 配置文件

    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8
    [mysqld]
    #设置3306端口
    port = 3306
    # 设置mysql的安装目录
    basedir=D:\mysql\mysql-5.6.44-winx64
    # 设置mysql数据库的数据的存放目录
    datadir=D:\mysql\mysql-5.6.44-winx64\data
    # 允许最大连接数
    max_connections=200
    # 服务端使用的字符集默认为8比特编码的latin1字符集
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB

扩展名.ini

卸载

# 卸载
    # net stop mysql 停止mysql服务
    # mysqld remove  删除服务
    # 把安装软件也删掉
    # 删除环境变量
    # 清除注册表/重启计算机

三、使用MySQL数据库

当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:

mysql -h 主机名 -u 用户名 -p 密码;
  • -h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;
  • -u : 所要登录的用户名;
  • -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

输入 exit 或 quit 退出登录。

登录,设置密码

初始状态下,管理员root,密码为空,默认只允许从本机登录localhost
设置密码
[root@egon ~]# mysqladmin -uroot password "123"        设置初始密码 由于原密码为空,因此-p可以不用
[root@egon ~]# mysqladmin -uroot -p"123" password "456"        修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码

命令格式:
[root@egon ~]# mysql -h172.31.0.2 -uroot -p456
[root@egon ~]# mysql -uroot -p
[root@egon ~]# mysql                    以root用户登录本机,密码为空

忘记密码

*linux平台下,破解密码的两种方式*

[root@egon ~]# rm -rf /var/lib/mysql/mysql #所有授权信息全部丢失!!!
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
[root@egon ~]# vim /etc/my.cnf    #mysql主配置文件
[mysqld]
skip-grant-table
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q
[root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql -u root -p123 #以新密码登录

windows平台下,5.7版本mysql,破解密码的两种方式:

#1 关闭mysql
#2 在cmd中执行:mysqld --skip-grant-tables
#3 在cmd中执行:mysql
#4 执行如下sql:
update mysql.user set authentication_string=password('') where user = 'root';
flush privileges;

#5 tskill mysqld #或taskkill -f /PID 7832
#6 重新启动mysql

方式一
#1. 关闭mysql,可以用tskill mysqld将其杀死
#2. 在解压目录下,新建mysql配置文件my.ini
#3. my.ini内容,指定
[mysqld]
skip-grant-tables

#4.启动mysqld
#5.在cmd里直接输入mysql登录,然后操作
update mysql.user set authentication_string=password('') where user='root and host='localhost';

flush privileges;

#6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了

方式二

在windows下,为mysql服务指定配置文件

*强调:配置文件中的注释可以有中文,但是配置项中不能出现中文*

#在mysql的解压目录下,新建my.ini,然后配置
#1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
default-storage-engine=innodb
innodb_file_per_table=1


#解压的目录
basedir=E:\mysql-5.7.19-winx64
#data目录
datadir=E:\my_data #在mysqld --initialize时,就会将初始数据存入此处指定的目录,在初始化之后,启动mysql时,就会去这个目录里找数据



#2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效
[client]
port=3306
default-character-set=utf8
user=root
password=123

#3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置
[mysql]
;port=3306
;default-character-set=utf8
user=egon
password=4573


#!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准

my.ini

统一字符编码

#1. 修改配置文件
[mysqld]
default-character-set=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

#mysql5.5以上:修改方式有所改动
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

#2. 重启服务
#3. 查看修改结果:
\s
show variables like '%char%'

显示当前时间

select now();

显示数据库版本

select version();

创建一个数据库

create database 数据库名 [其他选项];

例如我们需要创建一个名为python01 的数据库, 在命令行下执行以下命令:

create database python01 charset=utf8;  # charset=utf8 是指定数据库支持的编码类型,默认是拉丁文,注意不是utf-8

注意: MySQL语句以分号(;)作为语句的结束

查看数据库

show databases; # 注意加s

查看数据库的创建语句

show create database python01;

修改数据库的字符类型

alter database python01 charset=utf8;

删除数据库

drop databse python01;

使用数据库

use python01;

查看当前使用的数据库

select database();

三、数据表的操作

创建数据表

create table 数据表名字 (字段 类型 约束, ....)

eg:

create table xxxx (id int, name varchar(30));

查看数据表

show tables;

查看数据表详细信息

desc xxxx;

加约束

create table xxx (id int primary Key not null auto_increment, name varchar(30));

为了方便写的时候观看,可以拆成多行

create table xxx (
    id int primary Key not null auto_increment, 
    name varchar(30));

注意注意注意:表中的最后一个字段不要加逗号

小练习题

create table student(
    id int unsigned not null primary Key auto_increment,
    name varchar(20),
    age tinyint unsigned default 0,
    hight decimal(5, 2), # 有5个数字,其中两个是小数
    gender enum("男", "女", "中性", "保密") default "保密", # 枚举  enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female;set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
    cls_id int unsigned
);

往表中插入数据

insert into student value(0, "老王", 18, 180.88, "男", 1);

查看表中所有列

 select * from student;

建立表之间的关系

#一对多或称为多对一
三张表:出版社,作者信息,书

一对多(或多对一):一个出版社可以出版多本书

关联方式:foreign key
=====================多对一=====================
create table press(
id int primary key auto_increment,
name varchar(20)
);

create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);


insert into press(name) values
('北京工业地雷出版社'),
('人民音乐不好听出版社'),
('知识产权没有用出版社')
;

insert into book(name,press_id) values
('九阳神功',1),
('九阴真经',2),
('九阴白骨爪',2),
('独孤九剑',3),
('降龙十巴掌',2),
('葵花宝典',3)
;
#多对多
三张表:出版社,作者信息,书

多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多
  
关联方式:foreign key+一张新的表
=====================多对多=====================
create table author(
id int primary key auto_increment,
name varchar(20)
);


#这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);


#插入四个作者,id依次排开
insert into author(name) values('egon'),('alex'),('yuanhao'),('wpq');

#每个作者与自己的代表作如下
egon: 
九阳神功
九阴真经
九阴白骨爪
独孤九剑
降龙十巴掌
葵花宝典
alex: 
九阳神功
葵花宝典
yuanhao:
独孤九剑
降龙十巴掌
葵花宝典
wpq:
九阳神功


insert into author2book(author_id,book_id) values
(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(2,1),
(2,6),
(3,4),
(3,5),
(3,6),
(4,1)
;

四、数据表的增删改查

增加字段

alter table student add birthday datetime;

修改字段,不重命名版

alter table student modify birthday date; # birthday字段不变,改变类型

修改字段,重命名版

alter table student change birthday birth date default "1990-01-01";

删除字段

alter table student drop hight;

相应的值也会被删除

删除数据表

 drop table xxx;

最常用的部分,数据的增删改查

向表中插入数据

insert into classes value(0, "菜鸟班"); # classes的id被设定为自动增加,所以插入数据时id部分随便我们怎么写都行,都会自动改变按应该的顺序增加

eg:

insert into classes value(null, "菜鸟班");
insert into classes value(default, "菜鸟班");

# 枚举中的下标从1开始 1----------》 “男”

insert into student values(default, "小李飞刀“, 20, 1, 1, "1990-02-01");

img

部分插入

insert student(name, gender) values("小乔", 2);

多行插入

insert into student(name, gender) values("大乔", 2),("貂蝉", 2);

更新数据

update student set gender=2 where id=1; # 不指定id将全部修改

定条件查询

select * from student where name="小乔";
select * from student where id > 3;
select name, gender from student where id=2;
select name as 姓名, gender as 性别 from student where id=2;

img

删除数据

delect from student where xxx;

逻辑删除,用一个字段表示这条信息不在使用

给student添加is_delete字段,bit类型

alter table student add is_delete bit default 0;

复制表

复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;

只复制表结构
mysql> select * from service where 1=2;        //条件为假,查不到任何记录
Empty set (0.00 sec)
mysql> create table new1_service select * from service where 1=2;  
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create table t4 like employees;

总结

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
#1、DDL语句    数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
#2、DML语句    数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
#3、DCL语句    数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
#1. 操作文件夹
        增:create database db1 charset utf8;
        查:show databases;
        改:alter database db1 charset latin1;
        删除: drop database db1;


#2. 操作文件
    先切换到文件夹下:use db1
        增:create table t1(id int,name char);
        查:show tables
        改:alter table t1 modify name char(3);
              alter table t1 change name name1 char(2);
        删:drop table t1;
    

#3. 操作文件中的内容/记录
        增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
        查:select * from t1;
        改:update t1 set name='sb' where id=2;
        删:delete from t1 where id=1;

        清空表:
            delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
            truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,

            auto_increment 表示:自增
            primary key 表示:约束(不能重复且不能为空);加速查找

五、存储引擎

什么是数据库引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等

数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎

创建新表时如果不指定存储引擎 , 那么系统就会使用默认存储引擎 , MySQL 5.5 之前的默认存储引擎是MyISAM , 5.5 之后改为了InnoDB

查看当前数据库支持的存储引擎类型;

SHOW ENGINES;

查看正在使用的存储引擎

show variables like 'storage_engine%'; #查看正在使用的存储引擎

1.MyISAM 和 InnoDB的适用场景

MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。

InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。

2.MyISAM 和 InnoDB的区别

1)MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持

2)myisam表不支持外键

3)在执行数据库写入的操作(insert,update,delete)的时候,myisam表会锁表,而innodb表会锁行

4)当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快

#InnoDB 存储引擎
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。
InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。

#MyISAM 存储引擎
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。

#NDB 存储引擎
年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。

#Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。

#Infobright 存储引擎
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。

#NTSE 存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。

#BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。

MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。

1.存储引擎

数据的不同存储方式就是存储引擎

show engines;查看存储引擎

innodb 两个文件
	5.6及以上默认的存储引擎
	transaction 事务  保证数据安全 数据的完整性,在一段操作的前后加标志,读取到结束标志之前只进行内存级别的操作,不会直接修改硬盘数据。
	 row-level looking 行级锁 锁住一行数据,不让其他人修改
	table-level looking 表级锁 同理
	foreign keys 外键约束
	树tree  加速查询 (树形结构(数据+树)+ 表结构)

myisam 三个文件
	 mysql5.5以下 默认的存储方式
     table-level locking 表级锁
     树tree - 加速查询 (树形结构 + 数据 + 表结构)

 memory 1个文件
 	断电消失
    基于hash

查看表结构

show create table staff;

指定存储引擎存储

create table 表名(字段 类型,····) engine=myisam;

2.数据类型

数值

整数
tinyint   int

    create table int_t (
          ti tinyint,            # ****
          i  int,                # *****	无约束-128  127
          tiun tinyint unsigned,    
          iun int unsigned  				#数值类的约束条件,无符号,0-255
    );

浮点数

   create table fd_t(
            f float,      # 精度问题 小数点后5位 # *****
            d double,     # 精度更高但也不准确
            f2 float(5,2),# 在精确位四舍五入
            d2 double(5,2)# 在精确位四舍五入
    )

    create table dec_t(
        dec1 decimal,    	精度更高
        dec2 decimal(30,20)
    )

时间

    内置函数  now()
    datetime  打卡时间/日志/论坛博客类的评论\文章/*****
    (插入时间两种方式
    20190101121212
    ‘2019-12-12 12:12:12’
    )
    date      员工生日/入职日期/离职日期/开班时间   *****
    time      上课时间/下课时间/规定上班时间    竞赛数据
    year
    timestamp 由于表示范围的问题,导致用的少了
    create table time_t2(
        dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,   # 表示的范围更大,还能拥有timestamp的特点
        d  date,
        t  time,
        y  year,
        ts timestamp    # 不能为空,默认值是当前时间,在修改的时候同时更新时间
    )

字符串

字符串
    char    0-255    定长存储 存储速度更快 占用更多的空间  *****
        char(12)
        alex --> 'alex        ' --> 12的长度
    varchar 0-65535  变长存储 存储速度慢  占用的空间小  ****
        varchar(12)
        'alex' --> 'alex4' --> 5的长度

手机号码/身份证号码 : char
用户名/密码 : 有一定范围弹性 char
评论 : varchar


时间和空间
    时间换空间
    空间换时间

    create table ch_t(
        c char,
        c2 char(5),
        vc2 varchar(5)
    )

enum和set

enum和set
    单选题,只能从有限的条件中选择
    create table enum_t(
        id int,
        name char(12),
        gender enum('男','女','不详')
    )

    gender性别(男 女 不详)

    多选题,从有限的条件中选
    create table set_t(
        id int,
        name char(12),
        hobby set('抽烟','喝酒','烫头','搓脚')
    )
	不选不会报错,数据会显示空格

3.约束

 not null     	非空
 unique			唯一
 primary key	主键
 unsigned		无符号:数值专用
 default        默认添加字段
 
 ****一张表一个主键,主键就是非空加唯一,如果没设置主键,就是第一个非空加唯一的
 字段默认设置为主键。
 
 primary key =====not null unique

4.严格模式

1.开启与关闭Strict Mode方法
找到MySQL安装目录下的my.cnf(windows系统则是my.ini)文件
在sql_mode中加入STRICT_TRANS_TABLES则表示开启严格模式,如没有加入则表示非严格模式,修改后重启mysql即可
例如这就表示开启了严格模式: 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
 
2.Strict Mode功能说明
 
不支持对not null字段插入null值
不支持对自增长字段插入”值
不支持text字段有默认值
posted @ 2019-08-08 14:49  尤利阳  阅读(74)  评论(0编辑  收藏  举报