1、Maven是什么

Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建、报告和文件。

Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven按照标准的目录结构和默认构建声明周期。

在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可以重复使用,Maven让开发人员的工作更加轻松。同时创建报表、检查、构建和测试自动化设置。

通俗点说,Maven的核心功能就是合理描述项目间的依赖关系,即通过pom.xml的配置获取jar包,而不用手动去添加jar包。

Maven项目的结构和内容都在一个xml文件中声明,pol.xml项目对象模型,这是整个Maven系统的基本单元。

构建就是以我们编写的 Java 代码、框架配置文件、国际化等其他资源文件、JSP 页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。

那么项目构建的全过程中都包含哪些环节呢?
构建过程的几个主要环节
①清理:删除以前的编译结果(class文件),为重新编译做好准备。
②编译:将 Java 源程序编译为字节码文件。
③测试:(自动测试)针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应 war 包。
⑥安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

2、安装Maven

2.1 获取Apache Maven

打开Apache Maven下载页面下载最新的项目文件,比如我们下载目前最新版本apache-maven-3.6.1-bin.zip。
目前官网已经提供了3.6.2版本了,如下图所示

blob

2.2 构建maven目录

在你空间比较充足的分区中建立一个maven目录,比如我在E盘中建立一个maven目录,然后在maven目录下面新建一个repository目录用于作为存储maven工具下载下来的第三方资源的仓库目录,然后将下载下来的zip文件复制到maven目录,并解压,构建完成后的目录如下图所示。

blob

2.3 修改settings.xml配置

在apache-maven-3.6.1/conf/目录下,找到settings.xml文件,并打开它,修改配置中指向maven仓库的位置,配置位置大约在53行,我们将它的注释去掉,然后修改成自己本地仓库的位置,同时修改镜像源,配置修改如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- 修改成你仓库所在位置 -->
  <localRepository>E:\maven\repository</localRepository>
  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <servers></servers>
  <mirrors>
       <!-- 设置为阿里云仓库,加快下载速度 -->
       <mirror>
           <id>alimaven</id>
           <mirrorOf>central</mirrorOf>
           <name>aliyun maven</name>
           <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
       </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>jdk18</id>
      <activation>
        <jdk>1.8</jdk>
        <activeByDefault>true</activeByDefault>  
      </activation>
      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
    </profile>
  </profiles>
</settings>

2.4 配置环境变量

在环境变量path中加入环境变量指向E:\maven\apache-maven-3.6.1\bin,如下图所示

blob

3、仓库的概念

通过pom.xml中的配置,就可以获取相应版本的jar包,这些jar包就来自仓库。
仓库分为本地仓库、第三方仓库(私服)、中央仓库
– 本地仓库:默认在$user.home/.m2/respository 在前面我们已经通过修改settings.xml修改了本地库位置
– 第三方仓库:又称为内部中心仓库,也称为私服
– 中央仓库:Maven内置了远程公用仓库:http://repo1.maven.org/maven2 ,这个仓库由Maven自己维护,里面有大量的常用类库,目前以Java为主

4、使用命令管理Maven项目

4.1 创建Maven的Java项目

执行下面命令行:
mvn archetype:generate -DgroupId=com.xuetang9.maven -DartifactId=mavendemo -DarchetypeArtifactId=maven-archetype-quickstart

archetype:create 创建项目,高版本的Maven已经弃用create,使用generate
-DgroupId=com.xuetang9.maven 项目的groupid
-DartifactId=mavendemo 就是项目名称
-DarchetypeArtifactId=maven-archetype-quickstart 表示创建的是MavenJava项目
注意:一定要在cmd下运行!!

blob

注意:在命令行执行过程中需要输入如图中红框所示的内容完成创建

构建完成后我们可以看到项目的目录结构,如下图所示

blob

4.2 Maven目录结构:

blob

对项目进行编译后,会生成target目录,即输出目录

4.3 常用mvn命令:

mvn compile:编译,将src/main/java目录下的Java源码编译成class(target目录下)
mvn test:测试,将src/test/java目录编译成class
mvn clean:清理,删除target目录
mvn package:打包,生成压缩文件:jar包/war包,也是放在target目录下
mvn install:安装,将压缩文件上传到本地仓库,可以供他人调用
mvn deploy:部署/发布,将压缩文件上传到私服

4.4 Maven项目的完整生命周期

blob

红色标记字体的意思就是当我们直接使用 mvn install命令对项目进行上传至本地仓库时,那么前面所有的步骤将会自动执行,比如源代码的编译,打包等等。

4.5 其他命令

mvn eclipse:eclipse:将Java或Web工程转换成Eclipse工程
mvn eclipse:clean:清除eclipse设置信息,转换成原生Maven项目
mvn idea:idea:转换成Idea项目
mvn idea:clean:清除idea设置信息,转换成原生Maven项目

5、Eclipse中构建Maven项目

下面我们演示如何在Eclipse中构建一个Maven Java项目。

选择菜单File->New->Other,呼叫出下面的向导窗体。

blob

选择Next按钮

blob

点击Next按钮

blob

选择maven-archetype-quickstart,然后选择Next按钮

blob

输入Group Id(包名)和Atifact Id(项目名),点击Finish按钮,等待完成项目构建完成,如下图所示

blob

我们在pom.xml文件中加入一个依赖

<!-- 在dependencies节点中加入如下配置 -->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

然后右键项目选择如下图所示的菜单

blob

菜单选择完成后会弹出如下图所示的菜单

blob

选择OK按钮,等待项目完成依赖jar包下载,下载成功后我们查看项目依赖项,是否包含成功,如下图所示

blob

新建Person类

package com.xuetang9.hello_maven;

public class Person{
    private String name;
    private String email;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

修改App类的代码

package com.xuetang9.hello_maven;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class App {
    public static void main( String[] args ){
        //将一个Map对象转化为一个Bean
        //这个Map对象的Key必须与Bean的属性相对应
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        map.put("email","zhangsan@qq.com");
        map.put("age","21");
        Person person = new Person();
        try {
            //将map转化为一个Person对象
            BeanUtils.populate(person,map);
            System.out.println(person.getName() + ">>" + person.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

然后运行App类进行测试,测试成功表示,maven项目构建成功,并且完成BeansUtilities依赖包的导入

6、Idea中构建Maven项目

下面我们演示如何在Idea中构建一个Maven Java项目。

打开创建项目向导页面

选择archetype类型,为maven-archetype-quickstart

输入Group Id(包名)和Atifact Id(项目名),点击Next按钮

确认并设置本地之前安装的maven路径,点击Next

点击Finish,等待完成项目构建完成,如下图所示

我们在pom.xml文件中加入一个依赖

<!-- 在dependencies节点中加入如下配置 -->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

选择右下角提示框中“Import Changes”,完成第三方jar导入,导入完成后,查看依赖项导入结果

然后加入上面所示的java代码,运行测试,如果测试成功表示,maven项目构建成功,并且完成BeansUtilities依赖包的导入

在讲解视图的时候我们的明白下面几个概念。

什么是视图?

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。

视图是干什么用的?

通过视图,可以展现基表的部分数据;
视图数据来自定义视图的查询中使用的表,使用视图动态生成。
基表:用来创建视图的表叫做基表

为什么要使用视图?

因为视图的诸多优点,如下
1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

MySQL中的视图操作

因为视图是需要基表才能构建,因此在讲解视图的时候,我们需要先创建两张数据表用于后面演示视图操作,下面是测试表和测试数据创建的SQL语句。

DROP TABLE IF EXISTS `author`;
CREATE TABLE `author` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `author_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `author` VALUES ('1', 'Naaman');
INSERT INTO `author` VALUES ('2', 'Lucy');
INSERT INTO `author` VALUES ('3', 'Lily');
INSERT INTO `author` VALUES ('4', 'Jack');
DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) DEFAULT NULL,
  `content` varchar(255) DEFAULT NULL,
  `author_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk-author` (`author_id`),
  CONSTRAINT `fk-author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `blog` VALUES ('1', '测试博客1', '博客内容111', '1');
INSERT INTO `blog` VALUES ('2', '测试博客2', '测试内容222', '2');
INSERT INTO `blog` VALUES ('3', '测试博客3', '测试内容333', '4');

1、创建视图

首先我们来看看创建视图的SQL语法

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
   [WITH [CASCADED | LOCAL] CHECK OPTION]

OR REPLACE:表示在创建视图时候会替换已有视图
ALGORITHM:表示视图选择算法,将在文章的后面详细讲解
select_statement:表示select语句
[WITH [CASCADED | LOCAL] CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内,详情将在后面讲解
注意:推荐使用WHIT [CASCADED|LOCAL] CHECK OPTION选项,可以保证数据的安全性,所以建议加上它。
下面是推荐语法格式:

create view <视图名称>[(column_list)]
 as select语句
with check option;

1.1 创建单表视图

执行下面的SQL语句创建一个单表视图

create view v_author(编号,姓名)
as
select * from author
with check option;

执行结果如下图所示

blob

使用desc v_author命令查看视图信息,执行结果如下图所示

blob

然后执行select * from v_author查看视图里面显示的数据,执行结果如下图所示

blob

1.2 创建多表视图

执行下面的SQL语句创建一个多表视图

create view v_blog(编号,标题,内容,作者)
as
select b.id,b.title,b.content,a.author_name from author a,blog b
where a.id=b.author_id
with check option;

然后执行select * from v_blog查看多表视图中的数据,下图是执行结果

视图将我们不需要的数据过滤掉,将相关的列名用我们自定义的列名替换。视图作为一个访问接口,不管基表的表结构和表名有多复杂。
如果创建视图时不明确指定视图的列名,那么列名就和定义视图的select子句中的列名完全相同;
如果显式的指定视图的列名就按照指定的列名。
注意:显示指定视图列名,要求视图名后面的列的数量必须匹配select子句中的列的数量。

2、查看视图

使用show create view语句查看视图信息,比如

blob

视图一旦创建完毕,就可以像一个普通表那样使用,视图主要用来查询,比如
select * from v_blog where 编号=1;,执行结果如下图

blob

有关视图的信息记录在information_schema数据库中的views表中,我们可以通过SQL语句来查看,比如
select * from information_schema.views where TABLE_NAME='v_blog'\G;
执行结果如下图

blob

3、视图的更改

3.1 CREATE OR REPLACE VIEW语句修改视图

create or replace view view_name as select语句;
在视图存在的情况下可对视图进行修改,视图不在的情况下可创建视图

3.2 ALTER语句修改视图

ALTER
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

注意:修改视图是指修改数据库中已存在的表的定义,当基表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致

3.3、DML操作更新视图

因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中,比如我们执行以下操作

blob

当然,视图的DML操作,不是所有的视图都可以做DML操作。
有下列内容之一,视图不能做DML操作:
– select子句中包含distinct
– select子句中包含组函数
– select语句中包含group by子句
– select语句中包含order by子句
– select语句中包含union 、union all等集合运算符
– where子句中包含相关子查询
– from子句中包含多个表
– 如果视图中有计算列,则不能更新
– 如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作

3.4、drop删除视图

删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不会影响基表:

DROP VIEW [IF EXISTS]
view_name [, view_name] ...

比如 drop view if exists v_student;

4、使用WITH CHECK OPTION约束

对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束
作用:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。
首先我在向博客表中插入几条数据

INSERT INTO `blog` VALUES ('4', '测试博客4', '博客内容444', '1');
INSERT INTO `blog` VALUES ('5', '测试博客5', '测试内容555', '1');
INSERT INTO `blog` VALUES ('6', '测试博客6', '测试内容666', '1');

然后创建一个视图,获取指定作为为1的数据

create view v_blog_1(编号,标题,内容,作者编号)
as
select id,title,content,author_id from blog
where author_id = 1
with check option;

查询一下数据

select * from v_blog_1;

再使用update对视图进行修改:

update v_blog_1 set 作者编号=2 where 编号=1;

语句执行结果如下图所示

blob

因为违反了视图中的where author_id = 1子句,所以抛出异常;
利用with check option约束限制,保证更新视图是在该视图的权限范围之内。

使用WITH CHECK OPTION约束时,(不指定选项则默认是CASCADED)
可以使用CASCADED或者LOCAL选项指定检查的程度:
CASCADED:检查所有的视图,会检查嵌套视图及其底层的视图
LOCAL:只检查将要更新的视图本身,嵌套视图不检查其底层的视图

5、定义视图时的其他选项

视图的完整语法

CREATE [OR REPLACE]
  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  [DEFINER = { user | CURRENT_USER }]
  [SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
  [WITH [CASCADED | LOCAL] CHECK OPTION]

5.1 ALGORITHM选项

选择在处理定义视图的select语句中使用的方法
– UNDEFINED:MySQL将自动选择所要使用的算法
– MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
– TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句

缺省ALGORITHM选项等同于ALGORITHM = UNDEFINED

5.2 DEFINER选项

指出谁是视图的创建者或定义者
– definer= ‘用户名’@’登录主机’
– 如果不指定该选项,则创建视图的用户就是定义者,指定关键字CURRENT_USER(当前用户)和不指定该选项效果相同

5.3 SQL SECURITY选项

要查询一个视图,首先必须要具有对视图的select权限,如果同一个用户对于视图所访问的表没有select权限,那会怎么样?
SQL SECURITY选项决定执行的结果:
– SQL SECURITY DEFINER:定义(创建)视图的用户必须对视图所访问的表具有select权限,也就是说将来其他用户访问表的时候以定义者的身份,此时其他用户并没有访问权限。
– SQL SECURITY INVOKER:访问视图的用户必须对视图所访问的表具有select权限。

缺省SQL SECURITY选项等同于SQL SECURITY DEFINER

视图权限总结:
使用root用户定义一个视图(推荐使用第一种):u1、u2
1)u1作为定义者定义一个视图,u1对基表有select权限,u2对视图有访问权限:u2是以定义者的身份访问可以查询到基表的内容;
2)u1作为定义者定义一个视图,u1对基表没有select权限,u2对视图有访问权限,u2对基表有select权限:u2访问视图的时候是以调用者的身份,此时调用者是u2,可以查询到基表的内容。

一、字符集和校验规则

字符集是一套符号和编码,校验规则(collation)是在字符集内用于比较字符的一套规则,即字符集的排序规则。MySQL可以使用多种字符集和检验规则来组织字符。

MySQL服务器可以支持多种字符集,在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以指定使用不同的字符集,相比oracle等其他数据库管理系统,在同一个数据库只能使用相同的字符集,MySQL明显存在更大的灵活性。

每种字符集都可能有多种校对规则,并且都有一个默认的校对规则,并且每个校对规则只是针对某个字符集,和其他的字符集么有关系。
在MySQL中,字符集的概念和编码方案被看做是同义词,一个字符集是一个转换表和一个编码方案的组合。

Unicode(Universal Code)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode存在不同的编码方案,包括Utf-8,Utf-16和Utf-32。Utf表示Unicode Transformation Format。

二、查看MySQL字符集方法

1、查看mysql服务器支持的字符集

下面的SQL命令都可以查看MySQL数据库支持字符集
show character set;
select * from information_schema.character_sets;
我们使用第一条命令行举例,执行命令后可以看到下图所示的结果:

blob

2、查看字符集的校对规则

查询MySQL支持的所有校对规则:show collation;
查询MySQL支持的utf8校对规则:show collation like 'utf8%';
当然也可以使用select语句查询:
select * from information_schema.collations where collation_name like 'utf8%';
我们使用第一条命令举例,执行命令后可以看到下图所示的结果:

blob

3、查看当前数据库的字符集

执行show variables like 'character%';可以查看当前数据库使用的字符集,如下图所示:

blob

解释一下上图中变量名代表的意思:
character_set_client:客户端请求数据的字符集
character_set_connection:客户机/服务器连接的字符集
character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
character_set_filesystem:把os上文件名转化成此字符集,即把character_set_client转换character_set_filesystem,默认binary是不做任何转换的

character_set_results:结果集,返回给客户端的字符集
character_set_server:数据库服务器的默认字符集
character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。

4、查看当前数据库的校对规则

执行show variables like 'collation%';可以查看当前数据库使用的校对规则,如下图所示:

blob

解释一下上图中变量名代表的意思:
collation_connection:当前连接的字符集。
collation_database:当前日期的默认校对。每次用USE语句来“跳转”到另一个数据库的时候,这个变量的值就会改变。如果没有当前数据库,这个变量的值就是collation_server变量的值。
collation_server:服务器的默认校对。

排序方式的命名规则为:字符集名字语言后缀,其中各个典型后缀的含义如下:
1)_ci:不区分大小写的排序方式
2)_cs:区分大小写的排序方式
3)_bin:二进制排序方式,大小比较将根据字符编码,不涉及人类语言,因此_bin的排序方式不包含人类语言

三、MySQL字符集的设置

1、概述

MySQL字符集设置分为两类:
1)创建对象的默认值。
2)控制server和client端交互通信的配置。

1.1 创建对象的默认值

字符集合校对规则有4个级别的默认设置:
1)服务器级别;
2)数据库级别;
3)表级别、列级别;
4)连接级别。
更低级别的设置会集成高级别的设置。
这里有一个通用的规则:先为服务器或者数据库选择一个合理的字符集,然后根据不同的实际情况,让某个列选择自己的字符集。

1.2 控制server和client端交互通信的配置

大部分MySQL客户端都不具备同时支持多种字符集的能力,每次都只能使用一种字符集。
客户和服务器之间的字符集转换工作是由如下几个MySQL系统变量控制的。
1)character_set_server:MySQL服务端默认字符集。
2)character_set_database:数据库默认字符集。
3)character_set_client:MySQL服务端假定客户端发送的查询使用的字符集。
4)character_set_connection:MySQL服务端接收客户端发布的查询请求后,将其转换为character_set_connection变量指定的字符集。
5)character_set_results:MySQL服务端把结果集和错误信息转换为character_set_results指定的字符集,并发送给客户端。
6)character_set_system:系统元数据(字段名等)字符集
还有以collation_开头的同上面对应的变量,用来描述字符校对规则。
注意事项:
• my.ini中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使用libmysqlclient库的应用程序产生任何作用!
• 对字段进行的SQL函数操作通常都是以内部操作字符集进行的,不受连接字符集设置的影响。
• SQL语句中的裸字符串会受到连接字符集或introducer设置的影响,对于比较之类的操作可能产生完全不同的结果,需要小心!

1.3 默认情况下字符集选择规则

(1)编译MySQL时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时character_set_server被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

2、通过SQL命令完成字符集和校对规则的设定

2.1 为数据库指定字符集和校对规则

在创建数据库的时候就可以为数据库指定字符集和校对规则,SQL命令示例如下:
create database dbtest charset=utf8 collate utf8_romanian_ci;
charset=utf8表示设定数据库字符集为utf8
collate utf8_romanian_ci表示设定数据库校对规则为utf8_romanian_ci
我们可以通过show create database dbtest查看创建数据库的SQL语句,命令执行效果如下图所示:

blob

注意:创建数据库分配字符集可以采用以下几种语句都行:
charset=utf8;
default charset=utf8;
charset utf8;
default charset utf8;
char set=utf8;
default char set=utf8;
char set utf8;
default char set utf8;
character set=utf8;
default character set=utf8;
character set utf8;
default character set utf8;

2.2 为表指定字符集和校对规则

我们可以通用创建数据库表的时候为表指定字符集和校对规则,执行SQL命令如下:

create table table_charset(
c1 varchar(10),
c2 varchar(10)
)default charset=utf8 collate utf8_romanian_ci;

default charset=utf8表示设置字符集
collate utf8_romanian_ci表示设置校对规则
我们可以通过show create table table_charset查看创建表的SQL语句,命令执行效果如下图所示:

blob

注意:为表指定字符集可以使用以下几种方式:
default charset=utf8;
charset=utf8;
default character set=utf8;
character set=utf8;
default char set=utf8;
char set=utf8;

2.3 为表列指定字符集和校对规则

我们可以通过创建数据库表的时候就为列指定字符集和校对规则,执行SQL命令如下:

create table `column_charset` (
`c1` varchar(10) charset utf8 collate utf8_romanian_ci not null,
`c2` varchar(10) charset utf8 collate utf8_spanish_ci
);

语法与设置数据库表基本上一样,然后我们通过下面的SQL命令查看这张表的字符集规则

select table_name,column_name,collation_name
from information_schema.columns
where table_name='column_charset';

命令行执行结果如下图所示

blob

2.4 修改和设置MySQL服务器级别字符集

MySQL服务器支持众多不同的字符集,这类字符集可在编译时和运行时指定。

1)编译时指定
编译时可指定默认字符集和默认校对规则,要想同时更改默认字符集和校对规则,要同时使用–with-charset和–with-collation选项。
校对规则必须是字符集的合法校对规则,如以下编译示例
./configure --with-charset=utf8 --with-collation=utf8_romanian_ci
通过configure选项–with-extra-charsets=LIST,可以定义在服务器中再定义增加字符集。
LIST指下面任何一项:
a.空格间隔的一系列字符集名
b.complex -,以包括不能动态装载的所有字符集
c.all –,以将所有字符集包括进二进制
编译示例如下所示
./configure --with-charset=utf8 --with-collation=utf8_romanian_ci --with-extra-charsets=all
当然编译指定一般是在Linux操作系统下执行,在windows下面安装MySQL一般不做编译指定。

2)在参数文件my.ini中指定

[mysqld]
character_set_server=utf8
--影响参数:character_set_server 和 character_set_database
--注意:修改后要重启数据库才能生效。
[client]
default-character-set=utf8
--影响参数:character_set_client,character_set_connection 和character_set_results。
--注意:修改后无需重启数据库。

3)在启动参数前指定

./mysqld --character-set-server=utf8 &
--影响参数:
--character_set_server
--character_set_database

4)在mysql客户端登陆时通过–default-character-set指定

mysql -uroot -pmysql --default-character-set=utf8
--影响参数:
--set character_set_client
--set character_set_connection
--set character_set_results

5)临时指定

a)分别指定
mysql> SET character_set_client = utf8;
mysql> SET character_set_connection = utf8;
mysql> SET character_set_database = utf8;
mysql> SET character_set_results = utf8;
mysql> SET character_set_server = utf8;

b)mysql客户端使用:set names utf8;
等同于
set character_set_client=utf8;
set character_set_connection=utf8;
set character_set_results=utf8;

c)set character set utf8;
等同于
set character_set_client=utf8;
set character_set_results=utf8;
set collation_connection=@@collation_database;

3、总结

下面介绍下几个MYSQL命令:
查看数据库支持的所有字符集
show character set;
show char set;
查看当前状态 里面包括当然的字符集设置
status;
\s;
查看系统字符集设置,包括所有的字符集设置
show variables like 'char%';
查看sqlstudy数据库中表的字符集设置
show table status from sqlstudy like '%countries%';
查看表列的字符集设置,关键是在同一个表中,每列可以设置成不同的字符集
show full columns from countries;

知道怎么查看字符集了,下面我来说下如何设置这些字符集
1.修改服务器级
a. 临时更改,执行下面命令行:
SET GLOBAL character_set_server=utf8;
b. 永久更改:
修改my.ini文件

[mysqld]
character-set-server=utf8

2.修改数据库级
a. 临时更改,执行命令行:
SET GLOBAL character_set_database=utf8;
b. 永久更改:
改了服务器级就可以了

3.修改表级,执行命令行:
ALTER TABLE table_name DEFAULT CHARSET utf8;
更改了后永久生效

4.修改列级
修改示例:

alter table `products` change `products_model` `products_model` varchar(20)
character set utf8 collate utf8_general_ci null default null;

更改了后永久生效

5.更改连接字符集
a. 临时更改:
set names utf8;
b. 永久更改:
修改my.ini文件

[client]
#增加
default-character-set=utf8

三、MySQL数据库乱码原因以及解决方案

1、产生乱码的根本原因

1)客户机没有正确地设置client字符集,导致原先的SQL语句被转换成connection所指字符集,而这种转换,是会丢失信息的,如果client是utf8格式,那么如果转换成gb2312格式,这其中必定会丢失信息,反之则不会丢失。一定要保证connection的字符集大于client字符集才能保证转换不丢失信息。
2)数据库字体没有设置正确,如果数据库字体设置不正确,那么connection字符集转换成database字符集照样丢失编码,原因跟上面一样。

2、乱码或数据丢失

character_set_client:我们要告诉服务器,我给你发送的数据是什么编码?
character_set_connection:告诉字符集转换器,转换成什么编码?
character_set_results:查询的结果用什么编码?
如果以上三者都为字符集N,可简写为set names ‘N’;

2.1 乱码问题

向默认字符集为utf8的数据表插入utf8编码的数据前连接字符集设置为latin1,查询时设置连接字符集为utf8。
插入时根据MySQL服务器的默认设置,character_set_client、character_set_connection和character_set_results均为latin1;
插入操作的数据将经过latin1=>latin1=>utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存;
查询时的结果将经过utf8=>utf8的字符集转换过程,将保存的6个字节原封不动返回,产生乱码
依次执行下面SQL命令

set names latin1;
create table temp(name varchar(10)) charset utf8;
insert into temp values('中国');
select * from temp;

我们会看到如下的输出结果

blob

此时修改连接编码,在进行查询

set names utf8;
select * from temp;

命令执行后的输出结果

blob

注意:存储字符集编码比插入时字符集大时,如果原封不动返回数据会出现乱码,不过可通过修改查询字符集,避免乱码,即不会丢失数据。

3、乱码终极解决方案

1)首先要明确你的客户端时候何种编码格式,这是最重要的(IE6一般用utf8,命令行一般是gbk,一般程序是gb2312)
2)确保你的数据库使用utf8格式,很简单,所有编码通吃。
3)一定要保证connection字符集大于等于client字符集,不然就会信息丢失,比如: latin1 < gb2312 < gbk < utf8,若设置set character_set_client = gb2312,那么至少connection的字符集要大于等于gb2312,否则就会丢失信息
4)以上三步做正确的话,那么所有中文都被正确地转换成utf8格式存储进了数据库,为了适应不同的浏览器,不同的客户端,你可以修改character_set_results来以不同的编码显示中文字体,由于utf8是大方向,因此web应用是我还是倾向于使用utf8格式显示中文的。

MySQL有两种安装方式,一种是使用.msi安装文件按照提示向导安装,另一种是使用压缩包解压缩方式安装,对于喜欢环境干净的小伙伴,一定会选择解压缩的方式安装,接下来我们就来讲述如何在Windows 10下面使用解压缩的方式来安装MySQL8。

1、下载zip安装包

进入MySQL的官网下载MySQL8.0 For Windows的压缩包,点击进入下载页面
进入页面后不需要登录,后点击底部“No thanks, just start my download”即可开始下载,如下图所示:

blob

2、解压zip安装包

将压缩包解压到你存放软件的目录,比如在我这里将安装包解压到D:\Soft目录下面,解压后的安装包目录结构如下图所示:

blob

3、配置环境变量

将解压包bin目录加入到path环境变量值里面,如下图所示:

blob

4、配置初始化的my.ini文件

解压压缩包后我们会发现目录里面没有my.ini,没关系可以自行创建。在安装根目录下添加 my.ini(新建文本文件,将文件类型改为.ini),然后写入基本配置:

[mysqld]
# 设置服务端口为3306
port=3306
# 设置mysql的安装目录,注意目录需要使用\\连接
basedir=D:\\Soft\\mysql-8.0.11-winx64
# 设置mysql数据库的数据的存放目录,注意目录需要使用\\连接
datadir=D:\\Soft\\mysql-8.0.11-winx64\\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8

然后在安装目录新建一个存放数据文件的目录data,到此现在的安装包目录结构如下图所示:

blob

5、初始化数据库

后续的安装步骤我们会使用到命令行,为了使安装过程不会出现权限问题,需要我们使用管理员的方式启动控制台,在Windows 10以管理员启动控制台的方式非常简单,windows+x快捷键呼叫出操作菜单项,然后选择”Windows PowerShell(管理员)(A)”菜单,如下图所示:

blob

首先进入安装目录的bin目录,然后在执行 mysqld --initialize --console 命令,执行完命令后,会打印root用户初始默认密码,我这里执行结果如下图所示

blob

在图中我们看到命令执行结果有类似如下所示的输出内容:
A temporary password is generated for root@localhost: q;wFajoyO2?J
其中q;wFajoyO2?J就是root的默认密码,在没有更改密码前,需要记住这个密码,后续登录需要用到。要是你手贱,关快了,或者没记住,那也没事,删掉初始化的data目录,再执行一遍初始化命令,又会重新生成的。

6、安装服务

继续在刚才命令行窗体执行命令mysqld --install [服务名],后面的服务名可以不写,默认的名字为 mysql。当然,如果你的电脑上需要安装多个MySQL服务,就可以用不同的名字区分了,比如 mysql5 和 mysql8,在我的电脑中已经安装了mysql5,所以需要设置服务名,如下图所示

blob

然后打开服务面板,再次查看是否有mysql8这个服务器,如下图所示

blob

安装完成之后,我们可以通过命令行来启动服务器,也可以在服务管理面板中启动,下面列举启动和停止服务器命令行:
启动服务:net start mysql8
停止服务:net stop mysql8
下面我们通过命令行启动mysql服务,启动结果如下图所示:

blob

7、修改root密码

由于系统默认生成的mysql密码不方便记忆,所以我需要修改它,当然修改密码的前提是mysql服务器必须启动并且知道原始密码
首先使用mysql -u root -p命令登录mysql数据库,命令行执行后要求我们输入密码,将root的初始密码输入进去就可以了,登录成功后可以看到下图所示的界面。

blob

登录成功后,执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
SQL语法来修改root密码,比如我将密码修改成xuetang9@Mysql,命令执行效果如下图所示:

blob

然后在新开一个控制台窗体,重新以新密码登录数据库,如果能够成功登录那么表示修改成功。
注意:不要关闭修改密码那个窗体,防止万一你的数据库密码修改错误,还能够重新修改,如果关闭了在找回密码就比较麻烦了

到此,安装部署就完成了。

附加操作

管理员root的host是localhost,代表仅限本机登录访问。如果要允许开放其他ip登录,则需要添加新的host。如果要允许所有ip访问,可以直接修改成“%”。
下面我们来授予root用户具有远程访问权限。
首先创建一root远程账号,执行下面的SQL命令:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

然后执行GRANT命令给远程登录root账号赋予权限,下面列举两种权限开放方式。
授予所有访问权:GRANT ALL PRIVILEGES ON *.* TO '账号'@'%';
授权基本的查询修改权限:
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON *.* TO '账号'@'%';

由于root账号拥有所有权限,所以我们需要赋予root账号所有访问权限,执行下面的命令行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

下面是root账号授权设定,命令行执行截图

blob