• mysql基础-01



    typora-copy-images-to: images


    1.1 今日目标

    1. 掌握数据库的作用;
    2. 能够通俗的解释什么是关系型数据库;
    3. 能够至少说出三种关系型数据库;
    4. 掌握MySQL客户端登录和登出MySQL服务器;
    5. 理解数据库具体数据的存储逻辑;
    6. 掌握创建、查看和删除数据库;
    7. 了解MySQL数据库创建与删除指令对应的文件效果
    8. 掌握数据表的增删改查操作;
    9. 掌握数据的增删改查操作;

    1.2 数据库介绍

    1.2.1 作用

    数据库是用来存放数据的仓库

    数据库中存放的是一张张数据表,表中存放的是数据。

    1.2.2 数据库的发展史

    萌芽阶段:文件系统

    最初始的数据库是用磁盘来存储数据的。文件就是最早的数据库。

    第一代数据库:层次模型

    优点:这是导航结构

    优点:结构清晰,分类查询方便

    缺点:有可能造成数据无效

    第一代数据库:网状模型

    网状模型解决了层次模型的数据不一致的问题,但没有解决导航问题。导航结构在查询中有时候效率低下,比如查询整个公司的四月的营业额。

    第二阶段:关系模型

    特点:

    1、每个表都是独立的

    2、通过关系字段将两个表连接起来

    3、关系:两个表的公共字段

    4、关系型数据库中多表联合查询效率低下。

    多学一招:为了解决关系型数据库多表查询效率的问题,项目中使用了NoSQL(非关系型数据库,Redis、mongodb等等),在数据库中按照键值对来存储,它是关系型数据库的补充。

    1.2.3 SQL

    Structured Query Language(结构化查询语言),是用来操作关系型数据库的一门语言。这是一个关系型数据库的通用操作语言,也成为标准SQL,也叫SQL-92。

    脚下留心:数据库的生产厂商为了占有市场份额,都会在标准SQL的基础上扩展一些自己的东西以吸引用户。

    1.2.4 常用的关系型数据库

    关系型数据库 开发公司 使用语言
    access 微软公司 SQL
    SQL Server 微软公司 T-SQL
    Oracle 甲骨文公司 PL/SQL
    MySQL 被甲骨文公司收购 MySQL

    思考:已知标准SQL可以在所有的关系型数据库上运行,在Oracle上编写的PL/SQL能否在MySQL上运行?

    答:不可以,只能运行标准SQL

    1.3 连接服务器

    数据库是CS模式的软件,所以要连接数据库必须要有客户端软件。

    MySQL数据库默认端口号是3306

    1.3.1 window界面连接服务器

    一下客户端软件在

    1、Navicat

    2、MySQL-Front

    1.3.2 通过web窗体连接:用户名和密码都是root,包括自带的SQL_Front也是这个账号和密码

    主要有浏览器就可以访问数据库

    1.3.3 命令行连接(cmd命令行来写)

    首先进入phpstudy环境下的MySQL的bin目录

    host		-h	主机
    port		-P	端口号   (大写)
    user		-u	用户名
    password	-p	密码     (小写)
    

    连接数据库的方式:

    -- 连接数据库
    F:wampPHPTutorialMySQLin>mysql -h127.0.0.1 -P3306 -uroot -proot  -- 明文
    
    -- 如果连接本地数据库 -h可以省略 如果服务器端口是3306,-P端口号也可以省略
    F:wampPHPTutorialMySQLin>mysql -uroot -proot	-- 明文
    
    -- 密文
    F:wampPHPTutorialMySQLin>mysql -u root -p  
    Enter password: ****
    

    1.3.4 退出登录

    mysql> exit		-- 方法一
    mysql> quit		-- 方法二
    mysql> q		-- 方法三
    

    使用 PHP 脚本连接 MySQL

    PHP 提供了 mysqli_connect() 函数来连接数据库。该函数有 6 个参数,在成功链接到 MySQL 后返回连接标识,失败返回 FALSE 。 语法如下:

    mysqli_connect(host, username, password, dbname,port, socket);
    

    参数说明:

    参数 描述
    host 可选。规定主机名或 IP 地址。
    username 可选。规定 MySQL 用户名。
    password 可选。规定 MySQL 密码。
    dbname 可选。规定默认使用的数据库。
    port 可选。规定尝试连接到 MySQL 服务器的端口号。
    socket 可选。规定 socket 或要使用的已命名 pipe。

    你可以使用 PHP 的 mysqli_close() 函数来断开与 MySQL 数据库的链接。该函数只有一个参数为 mysqli_connect() 函数创建连接成功后返回的 MySQL 连接标识符。语法如下:

    bool mysqli_close ( mysqli $link )
    

    本函数关闭指定的连接标识所关联的到 MySQL 服务器的非持久连接。如果没有指定 link_identifier,则关闭上一个打开的连接。提示:通常不需要使用 mysqli_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。

    实例:连接 MySQL

    <?php 
    $dbhost = 'localhost';  // mysql服务器主机地址 
    $dbuser = 'root';            // mysql用户名 
    $dbpass = 'root';          // mysql用户名密码 
    $conn = mysqli_connect($dbhost, $dbuser, $dbpass); 
    if(! $conn ) {    
        die('Could not connect: ' . mysqli_error()); 
    } 
    echo '数据库连接成功!'; 
    mysqli_close($conn); 
    ?> 
    >>>
    据库连接成功!
    

    1.4 数据库基本概念

    1.4.1 数据库、表相关

    1. 数据库:数据库中存放的是表,一个数据库中可以存放多个表

    2. 表:表是用来存放数据的。

    3. 关系:两个表的公共字段

    4. 行:也称记录,也称实体,就是一行的数据

    5. 列:也称字段,也称属性,竖的就是一列

    脚下留心:就表结构而言,表分为行和列;就表数据而言,表分为记录和字段;就面向对象而言,一个记录即一行就是一个实体(也就是对象),一个字段(一列)就是一个属性(对象有自己的属性)。

    1.4.2 数据相关

    1、数据冗余:相同的数据存储在不同的地方

    冗余只能减少,不能杜绝。
    减少冗余的方法是分表
    

    2、数据完整性:正确性+准确性=数据完整性:两个Mary Beth的Address不一样,以后就说数据不完整

    正确性:数据类型正确
    准确性:数据范围要准确
    

    思考:学生的年龄是整型,输入1000岁,正确性和准确性如何?

    答:正确的,但不准确。失去了数据完整性(具体是数据范围不对,但是统称数据不完整)。

    1.4.3 数据库执行过程

    1.5 数据库的操作

    1.5.1 创建数据库

    先打开命令行连接数据库:F:wampPHPTutorialMySQLin>mysql -uroot -p
    Enter password: ****

    语法:

    create database [if not exists] 数据名 [选项]
    

    例题

    -- 安装MySQL的话,事先就会有自带的几个数据库,可以查询看看,用命令show databases;结尾得有分号
    -- 创建数据库:这里的database不带s
    mysql> create database stu;
    Query OK, 1 row affected (0.06 sec)
    
    -- 创建数据库时,如果数据库已经存在就要报错
    mysql> create database stu;
    # ERROR 1007 (HY000): Can't create database 'stu'; database exists
    
    -- 在创建数据库时候,判断数据库是否存在,不存在就创建
    -- 1 warning (0.00 sec)警告:表示已经存在要创建的数据库
    -- Query OK, 1 row affected (0.03 sec)创建成功
    mysql> create database if not exists stu;
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    -- 特殊字符、关键字做数据库名会报错,需要使用反引号将数据库名括起来;反引号在Tab键的上面那一个
    mysql> create database `create`;
    Query OK, 1 row affected (0.04 sec)
    
    mysql> create database `%$`;
    Query OK, 1 row affected (0.05 sec)
    
    -- 创建数据库时指定存储的字符编码
    mysql> create database emp charset=gbk;
    Query OK, 1 row affected (0.00 sec)
    # 如果不指定编码,数据库默认使用安装数据库时指定的编码
    

    MySQL数据库的目录

    数据库保存的路径在安装MySQL的时候就配置好。
    也可以在my.ini配置文件中更改数据库的保存地址。默认是在(datadir="F:/wamp/PHPTutorial/MySQL/data/")
    一个数据库就对应一个文件夹,在文件夹中有一个db.opt文件,新创建的数据库的文件夹(没有写入数据的话)只有一个db.opt。在此文件中设置数据库的字符集和校对集
    


    小结:

    1、如果创建的数据库已存在,就会报错。

    解决方法:创建数据库的时候判断一下数据库是否存在,如果不存在再创建
    

    2、如果数据库名是关键字和特殊字符要报错。

    解决:在特殊字符、关键字行加上反引号
    

    3、创建数据库的时候可以指定字符编码

    脚下留心:创建数据库如果不指定字符编码,默认和MySQL服务器的字符编码是一致的。
    

    1.5.2 显示所有数据库

    语法:

    show databases
    

    结果:

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    4 rows in set (0.00 sec)
    

    注意:数据库安装后,会自带上面四个数据库

    1.5.3 删除数据库

    语法:

    drop database [if exists] 数据库名
    

    例题

    mysql> drop database `create`;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> drop database `%$`;
    Query OK, 0 rows affected (0.00 sec)
    -- 判断数据库是否存在,如果存在就删除
    mysql> drop database if exists stu;
    Query OK, 0 rows affected (0.00 sec)
    

    小结:
    1、如果删除的数据库不存在,会报错

    解决:删除之前判断一下,如果存在就删除
    

    1.5.4 显示创建数据库的语句:可以查看创建的时候用的什么字符编码

    语法:

    show create database 数据库名;
    

    例题:

    mysql> show create database emp;
    +----------+-------------------------------------------------------------+
    | Database | Create Database                                             |
    +----------+-------------------------------------------------------------+
    | emp      | CREATE DATABASE `emp` /*!40100 DEFAULT CHARACTER SET gbk */ |
    +----------+-------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    1.5.5 修改数据库

    只能修改数据库选项,数据库的选项只有一个,那就是字符编码

    语法:

    alter database 数据库名 charset=字符编码
    

    例题:

    mysql> alter database emp charset=utf8;
    Query OK, 1 row affected (0.00 sec)
    

    小结:

    1、修改数据库只能修改数据库的字符编码

    2、在MySQL中utf字符编码之间没有横杆utf8

    1.5.6 选择使用哪个数据库

    语法:在对某个数据库的表进行操作之前,要先选择这个数据库(可以理解为进入这个数据库)

    use 数据库名
    

    例题

    mysql> use emp;
    Database changed
    

    1.6 表的操作

    -- 首先要选中某个数据库
    mysql> create database data;
    Query OK, 1 row affected (0.00 sec)
    mysql> use data;
    Database changed
    

    1.6.1 创建表

    语法:

    create table [if not exists] `表名`(
        `字段名` 数据类型 [null|not null] [default] [auto_increment] [primary key] [comment],
        `字段名` 数据类型 …
    )[engine=存储引擎] [charset=字符编码]
    
    null|not null     是否为空
    default:          默认值
    auto_increment    自动增长,默认从1开始,每次递增1
    primary key       主键,主键的值不能重复,不能为空,每个表必须只能有一个主键
    comment:          备注
    engine            引擎决定了数据的存储和查找方式   myisam、innodb
    
    脚下留心:表名和字段名如果用了关键字,要用反引号引起来。
    

    例如:

     -- 设置客户端和服务器通讯的编码
    mysql> set names gbk;  -- 以后连接完数据库之后,要先把这个写上,下面用特殊字符作为字段名才会成功,才能用中文
    Query OK, 0 rows affected (0.00 sec)
    
    -- 创建简单的表
    mysql> create table stu1(
        -> id int auto_increment primary key,
        -> name varchar(20) not null
        -> )engine=innodb charset=gbk;
    Query OK, 0 rows affected (0.11 sec)
    
    -- 创建复杂的表
    mysql> create table stu2(
        -> id int auto_increment primary key comment '主键',
        -> name varchar(20) not null comment '姓名',
        -> `add` varchar(50) not null default '地址不详' comment '地址',
        -> score int comment '成绩,可以为空'
        -> )engine=myisam;
    Query OK, 0 rows affected (0.06 sec)
    

    小结:

    1、如果不指定引擎,默认是innodb

    2、如果不指定字符编码,默认和数据库编码一致

    3、varchar(20) 表示字符串长度是20个字符

    数据表的文件

    一个数据库对应一个文件夹
    一个表对应一个或多个文件
    如果引擎是myisam,一个表对应三个文件,分开存储;查看php环境里的数据库data的表文件E:php_enviromentPHPTutorialMySQLdatadata
    	.frm	:存储的是表结构
    	.myd	:存储的是表数据
    	.myi	:存储的表数据的索引
    引擎是innodb,一个表对应一个表结构文件,innodb的所有表的数据都保存在ibdata1文件中,如果数据量很大,会自动的创建ibdata2,ibdata3...
    

    innodb和myisam的区别

    引擎
    myisam 1、查询速度快
    2、容易产生碎片
    3、不能约束数据
    innodb 1、以前没有myisam查询速度快,现在已经提速了
    2、不产生碎片
    3、可以约束数据

    脚下留心:推荐使用innodb。

    1.6.2 显示所有表

    上面已经创建了两个表stu1和stu2

    show tables;
    >>>
    +----------------+
    | Tables_in_data |
    +----------------+
    | stu1           |
    | stu2           |
    +----------------+
    2 rows in set (0.00 sec)
    

    1.6.3 显示创建表的语句

    语法

    show create table 表名;	 -- 结果横着排列
    show create table 表名G  -- 将结果竖着排列;注意结尾没有分号
    

    例题

    1.6.4 查看表结构

    语法

    describe 表名;
    -- 可以省略写
    desc 表名;
    

    例题

    -- 方法一
    mysql> describe stu2;
    +-------+-------------+------+-----+----------+----------------+
    | Field | Type        | Null | Key | Default  | Extra          |
    +-------+-------------+------+-----+----------+----------------+
    | id    | int(11)     | NO   | PRI | NULL     | auto_increment |
    | name  | varchar(20) | NO   |     | NULL     |                |
    | add   | varchar(50) | NO   |     | 地址不详        |                |
    | score | int(11)     | YES  |     | NULL     |                |
    +-------+-------------+------+-----+----------+----------------+
    4 rows in set (0.05 sec)
    
    -- 方法二
    mysql> desc stu2;
    +-------+-------------+------+-----+----------+----------------+
    | Field | Type        | Null | Key | Default  | Extra          |
    +-------+-------------+------+-----+----------+----------------+
    | id    | int(11)     | NO   | PRI | NULL     | auto_increment |
    | name  | varchar(20) | NO   |     | NULL     |                |
    | add   | varchar(50) | NO   |     | 地址不详        |                |
    | score | int(11)     | YES  |     | NULL     |                |
    +-------+-------------+------+-----+----------+----------------+
    4 rows in set (0.00 sec)
    

    1.6.5 复制表

    语法一:create table 新表 select 字段 from 旧表,特点:不能复制父表的键,能够复制父表的数据

    mysql> create table stu4 select id,name from stu1; -- *表示所有字段,select * from stu1;
    Query OK, 0 rows affected (2.10 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    mysql> desc stu4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   |     | 0       |       |
    | name  | varchar(20) | NO   |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    mysql> select * from stu4; -- 如果有数据被复制过来,这条语句可以查看所有的数据
    

    语法二:create table 新表 like 旧表

    特点:只能复制表结构(复制主键),不能复制表数据

    mysql> create table stu3 like stu1;
    Query OK, 0 rows affected (1.08 sec)
    mysql> desc stu3;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(20) | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    2 rows in set (0.01 sec)
    

    1.6.6 删除表

    语法:

    drop table [if exists] 表1,表2,… 
    

    例题:

    -- 删除表
    mysql> show tables;
    +----------------+
    | Tables_in_data |
    +----------------+
    | stu1           |
    | stu2           |
    | stu3           |
    | stu4           |
    +----------------+
    4 rows in set (0.00 sec)
    
    mysql> drop table stu4; -- 如果删除的表不存在,会报错
    Query OK, 0 rows affected (0.06 sec)
    
    -- 如果表存在就删除
    mysql> drop table if exists stu4;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    -- 一次删除多个表
    mysql> drop table stu2,stu3;
    Query OK, 0 rows affected (0.03 sec)
    mysql> show tables;
    +----------------+
    | Tables_in_data |
    +----------------+
    | stu1           |
    +----------------+
    1 row in set (0.00 sec)
    

    1.6.7 修改表

    语法:alter table 表名 
    

    创建初始表

    mysql> create table stu(
        -> id int,
        -> name varchar(20)
        -> );
    Query OK, 0 rows affected (0.00 sec)
    

    1、添加字段:alter table 表名add [column] 字段名 数据类型 [位置]

    mysql> alter table stu add `add` varchar(20);	-- 默认添加字段放在最后
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> alter table stu add sex char(1) after name;  -- 在name之后添加sex字段
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> alter table stu add age int first;  -- age放在最前面
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc stu;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | age   | int(11)     | YES  |     | NULL    |       |
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(20) | YES  |     | NULL    |       |
    | sex   | char(1)     | YES  |     | NULL    |       |
    | add   | varchar(20) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    5 rows in set (0.00 sec)
    

    2、删除字段:alter table 表名 drop [column] 字段名

    mysql> alter table stu drop age;   -- 删除age字段
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    3、修改字段(改名):alter table 表 change [column] 原字段名 新字段名 数据类型 …

    -- 将name字段更改为stuname varchar(10)
    mysql> alter table stu change name stuname varchar(10);
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc stu;
    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | id      | int(11)     | YES  |     | NULL    |       |
    | stuname | varchar(10) | YES  |     | NULL    |       |
    | sex     | char(1)     | YES  |     | NULL    |       |
    | add     | varchar(20) | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    

    4、修改某个字段的类型(不改名):alter table 表 modify 字段名 字段属性…

    -- 将sex数据类型更改为varchar(20)
    mysql> alter table stu  modify sex varchar(20);
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    -- 将add字段更改为varchar(20) 默认值是‘地址不详’
    mysql> alter table stu modify `add` varchar(20) default '地址不详';
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    5、修改引擎:alter table 表名 engine=引擎名

    mysql> alter table stu engine=myisam;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    6、修改表名:alter table 表名 rename to 新表名

    -- 将stu表名改成student
    mysql> alter table stu rename to student;
    Query OK, 0 rows affected (0.00 sec)
    

    7、将表移动到其他数据库

    -- 将当前数据库中的student表移动到php74数据库中改名为stu,演示前要先创建数据库php74
    mysql> alter table student rename to php74.stu;
    Query OK, 0 rows affected (0.00 sec)
    

    1.7 数据操作:增删改查

    1.7.1 插入数据

    语法:insert into 表名 (字段名1, 字段名2,…) values (值1, 值2,…)

    1、插入所有字段

    假设stu:这里是没有任何数据的
    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | id      | int(11)     | YES  |     | NULL    |       |
    | stuname | varchar(10) | YES  |     | NULL    |       |
    | sex     | varchar(20) | YES  |     | NULL    |       |
    | add     | varchar(20) | YES  |     | 地址不详    |       |
    +---------+-------------+------+-----+---------+-------+
    -- 插入所有字段
    mysql> insert into stu (id,stuname,sex,`add`) values (1,'tom','男','北京');
    Query OK, 1 row affected (0.00 sec)
    
    -- 插入部分字段
    mysql> insert into stu(id,stuname) values (2,'berry');
    
    -- 插入的字段和表的字段可以顺序不一致。但是插入字段名和插入的值一定要一一对应
    mysql> insert into stu(sex,`add`,id,stuname) values ('女','上海',3,'ketty');
    Query OK, 1 row affected (0.00 sec)
    
    -- 如果插入的值的顺序和个数与表字段的顺序个数一致,插入的字段名可以省略
    mysql> insert into stu values(4,'rose','女','重庆');
    Query OK, 1 row affected (0.00 sec)
    

    小结:

    1、插入字段名的顺序和数据表中字段名的顺序可以不一致
    2、插入值的个数、顺序必须和插入字段名的个数、顺序要一致。
    3、如果插入的值的顺序和个数与表字段的顺序个数一致,插入字段可以省略。
    

    2、插入默认值和空值

    mysql> insert into stu values (5,'jake',null,default);-- default关键字用来插入默认值,null用来插入空值.
    Query OK, 1 row affected (0.05 sec)
    

    3、插入多条数据

    mysql> insert into stu values (6,'李白','男','四川'),(7,'杜甫','男','湖北');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    

    1.7.2 更新数据

    语法:update 表名 set 字段=值 [where 条件]

    -- 将berry性别改为女
    mysql> update stu set sex='女' where stuname='berry';
    Query OK, 1 row affected (0.06 sec)
    
    -- 将编号是1号的学生性别改成女,地址改为上海。
    mysql> update stu set sex='女',`add`='上海' where id=1;
    Query OK, 1 row affected (0.00 sec)
    

    1.7.3 删除数据

    语法:delete from 表名 [where 条件]

    -- 删除1号学生
    mysql> delete from stu where id=1;
    
    -- 删除名字是berry的学生
    mysql> delete from stu where stuname='berry';
    Query OK, 1 row affected (0.00 sec)
    
    -- 删除所有数据
    mysql> delete from stu;
    Query OK, 5 rows affected (0.00 sec)
    
    mysql> select * from stu;
    Empty set (0.00 sec)
    

    多学一招:delete from 表和truncate table 表区别?

    1、delete from 表:遍历表记录,一条一条的删除
    2、truncate table:将原表销毁,再创建一个同结构的新表。就清空表而言,这种方法效率高。没错
    

    1.7.4 查询数据

    语法:

    select 列名 from 表名
    

    例题

    假设stu:这里是没有任何数据的
    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | id      | int(11)     | YES  |     | NULL    |       |
    | stuname | varchar(10) | YES  |     | NULL    |       |
    | sex     | varchar(20) | YES  |     | NULL    |       |
    | add     | varchar(20) | YES  |     | 地址不详    |       |
    +---------+-------------+------+-----+---------+-------+
    -- 查询id字段的值
    mysql> select id from stu;
    Empty set (0.00 sec)
    -- 查询id,stuname字段的值
    mysql> select id,stuname from stu;
    Empty set (0.00 sec)
    -- 查询所有字段的值
    mysql> select * from stu;
    Empty set (0.00 sec)
    

    1.7.5 数据传输时使用字符集

    发现:在插入数据的时候,如果有中文会报错(或者中文无法插入)

    分析:

    1、查看客户端发送的编码:cmd命令窗口,右键点击属性,在点击选项

    2、查看服务器接受,返回的编码

    更改接受客户端指令的编码

    mysql> set character_set_client=gbk;
    Query OK, 0 rows affected (0.05 sec)
    

    原因:返回编码是utf8,客户端是gbk;

    测试:用gbk编码返回结果,测试成功

    可以通过set names一次性设置

    小结:

    1、设置什么编码取决于客户端的编码

    2、通过set names 设置编码

    1.8 补充知识

    每次执行指令要进入相应的目录中,麻烦,可以通过环境变量简化操作。

    1.8.1 环境变量配置

    我的电脑右键——属性——高级

    将mysql指令目录地址添加到环境变量的Path值中

    这时候就可以在任意目录下使用mysql指令

    原理:

    1、输入指令后,首先在当前目录下查找,如果当前目录下找不到,就到环境变量的Path中查找

    2、Path中有很多目录,从前往后查找

    1.8.2 校对集

    1、概念:在某种字符集下,字符之间的比较关系,比如a和B的大小关系,如果区分大小写a>B(因为你ASCII的a的值大),如果不区分大小写则a<B。比如赵钱孙李大小关系,不同的标准关系不一样

    2、校对集依赖与字符集,不同的字符集的的比较规则不一样,如果字符集更改,校对集也重新定义。

    3、不同的校对集对同一字符序列比较的结果是不一致的。

    4、 可以在定义字符集的同时定义校对集、 语法:

     collate = 校对集
    

    例题:

    定义两个表,相同字符集,不同校对集

    mysql> create table stu1(
        -> name char(1)
        -> )charset=utf8 collate=utf8_general_ci;
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> create table stu2(
        -> name char(1)
        -> )charset=utf8 collate=utf8_bin;
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> insert into stu1 values ('a'),('B');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> insert into stu2 values ('a'),('B');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    

    测试:两个表的数据都是有小到大排序

    mysql> select * from stu1 order by name;   -- 不区分大小写
    +------+
    | name |
    +------+
    | a    |
    | B    |
    +------+
    2 rows in set (0.08 sec)
    
    mysql> select * from stu2 order by name;   -- 区分大小写
    +------+
    | name |
    +------+
    | B    |
    | a    |
    +------+
    2 rows in set (0.00 sec)
    
    

    小结校对集规则:

    _bin:按二进制编码比较,区别大小写

    _ci:不区分大小写

  • 相关阅读:
    Adding a prefix header to an iOS project
    DZ论坛常见基本设置问题
    DZ论坛如何去掉“今日”“昨日”发帖数显示?
    Discuz源码
    怎样使Firefox的新建标签页为空白页
    discuz论坛
    TK域名首次注册教程(咸干花生)
    氪星年货 #1:那些来自大牛的真知灼见
    慢性子
    life and penis
  • 原文地址:https://www.cnblogs.com/IronMind/p/13336637.html
Copyright © 2020-2023  润新知