Mysql

Mysql介绍

MySQL版本

    一般强大的开源软件都是双授权的,双授权版本分为:

  • 社区版:完全免费,功能也够
  • 商业版:收费,功能更多更强大,有售后服务,也会参考和吸收社区版的一些功能,安全性和稳定性是最好的。

    每个版本分四个版本依次进行发布:

  • Alpha版:一般只在开发公司内部使用,不对外公开。测试、自我检查的版本
  • Beta版:一般是开发完也测试完的版本,不会出现比较大的性能bug(一般不用,阿里、去哪儿会使用这个版本,有些新功能,内部有高手能调,也能评估新功能的特性)
  • RC版:根据Beta版测试之后收集到一些bug等再进行完善的一个版本
  • GA版:软件正式发布的版本,没有特别的需求推荐使用GA版

MySQL产品线

    MySQL是C++写的

    最早期,MySQL是按照3.x--4.x--5.x等来开发的,但是为了提高MySQL的竞争优势,以及提高性能、降低开发维护成本等原因,同时,更方便企业用户更精准的选择合适的版本产品用于自己的企业生产环境中,MySQL在发展到5.1系列版本之后,重新规划为三条产品线。

  • 第一条:5.0.xx 到 5.1.xx产品线系列介绍
  • 第二条:5.4.xx 到 5.7.xx产品线系列介绍(主流:5.5和5.6)
  • 第三条:6.0.xx 到 7.1.xx产品线系列介绍

MySQL数据库软件命名

    以MySQL-5.6.42 tar.gz版本为例

  • 第一个数字5是主版本号,描述了文件格式。所有版本5发行都有相同的文件格式
  • 第二个数字6是发行级别,主版本号和发行级别组合到一起便构成了发行序列号
  • 第三个数据42是在此发生系列的版本号,随每个新发布版递增。

    通常已经发行的最新版本每次更新后,版本字符串最后一个数字会递增。如果增加了一些新功能或者微小的不兼容性,版本字符串的第二个数字递增。如果文件格式改变,第一个数字递增。

    一般有的版本也会加上版本后缀(beta、alpha、rc、ga),如果不带后缀,就相当于GA版

MySQL版本选择建议

  • 稳定版:选择开源的社区版的稳定版GA版本发布6个月以上的GA版本,且前后几个月没有大的Bug修复
  • 产品线:可以选择5.1、5.5、5.6。互联网公司主流5.5和5.6,其次是5.1

MySQL下载和安装

下载

安装

Windows

    本文以第二种安装方式为例演示MySQL操作

#1、下载:MySQL Community Server 5.7.16
    http://dev.mysql.com/downloads/mysql/

#2、解压
    如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64

#3、添加环境变量
    【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】
 
#4、初始化
    mysqld --initialize-insecure

#5、启动MySQL服务
    mysqld # 启动MySQL服务

#6、启动MySQL客户端并连接MySQL服务
    mysql -u root -p # 连接MySQL服务器

#7、将mysql添加系统服务
    注意:--install前,必须用mysql启动命令的绝对路径
    # 制作MySQL的Windows服务,在终端执行此命令:
    "c:\mysql-5.7.16-winx64\bin\mysqld" --install
 
    # 移除MySQL的Windows服务,在终端执行此命令:
    "c:\mysql-5.7.16-winx64\bin\mysqld" --remove

    注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
    # 启动MySQL服务
    net start mysql
 
    # 关闭MySQL服务
    net stop mysql
Win10安装MySQL

Linux

1.解压tar包
cd /software   #cd到一个自己创建的文件夹中
tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz  #解压下载下来的mysql文件,如果没在这个文件夹中,记得把文件移动到这个文件夹中,通过mv指令
mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21 #通过mv指令给这个解压出来的文件改了个名字

2.添加用户与组
groupadd mysql        #添加用户组
useradd -r -g mysql mysql  #创建mysql用户,并添加到mysql用户组
chown -R mysql:mysql mysql-5.6.21  #这是mysql用户和mysql用户组的归属
chmod +x -Rf /usr/local/mysql    #赐予可执行权限

3.安装数据库
su mysql
cd mysql-5.6.21/scripts
./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data  #使用mysql用户来将我们下载并解压的那个mysql文件,安装到/software/mysql-5.6.21/data这个目录里面

4.配置文件
cd /software/mysql-5.6.21/support-files  #配置文件在这个目录下
cp my-default.cnf /etc/my.cnf  #copy一份my-default.cnf文件到etc目录下,并起名为my.cnf文件
cp mysql.server /etc/init.d/mysql  #copy一份mysql.server文件,到etc的init.d的mysql文件夹中,启动加载的初始配置文件会有一部分在这个目录里面读取
vim /etc/init.d/mysql   #若mysql的安装目录是/usr/local/mysql,则可省略此步
修改文件中的两个变更值
basedir=/software/mysql-5.6.21  #基础目录
datadir=/software/mysql-5.6.21/data  #数据目录

5.配置环境变量
vim /etc/profile  #环境变量的配置文件 ,添加下面两行
export MYSQL_HOME="/software/mysql-5.6.21"
export PATH="$PATH:$MYSQL_HOME/bin"
#使配置生效,通过source指令
source /etc/profile

6.添加自启动服务
chkconfig --add mysql
chkconfig mysql on

7.启动mysql
service mysql start

8.登录mysql及改密码与配置远程访问
mysqladmin -u root password 'your_password'     #修改root用户密码
mysql -u root -p     #登录mysql,需要输入密码
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;     #允许root用户远程访问(默认远程连接是不能使用root用户来连接的)
mysql>FLUSH PRIVILEGES;     #刷新权限

9. 一些必要的初始配置(除了下面这些,将来玩mysql的时候还有很多很多的配置)
1)修改字符集为UTF8
vi /etc/my.cnf
在[client]下面添加 default-character-set = utf8
在[mysqld]下面添加 character_set_server = utf8
2)增加错误日志
vi /etc/my.cnf
在[mysqld]下面添加:
log-error = /usr/local/mysql/log/error.log
general-log-file = /usr/local/mysql/log/mysql.log
3) 设置为不区分大小写,linux下默认会区分大小写。
vi /etc/my.cnf
在[mysqld]下面添加:
lower_case_table_name=1

修改完重启:#service  mysql  restart
Linux安装MySQL

     Linux系统下MySQL数据库企业生产中常用的4种安装方法:

  • yum/rpm方式安装MySQL
  • 常规方式编译安装MySQL
  • 采用cmake方式编译安装MySQL
  • 采用二进制方式免编译安装MySQL

Mac

    如果Mac本安装完mysql之后,登陆以后,不管运行什么指令,总是提示这个:mac mysql error You must reset your password using ALTER USER statement before executing this statement。只需修改密码就行了,默认安装完成之后,mysql应该是安装在了/usr/local/mysql这个目录下,里面的目录结构和windows的是一样的。

 MySQL安装目录介绍

    看图:

      

    data文件夹:

        

        

    information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。 
information_schema数据库表说明:
    SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。 TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
    COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
    STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
    USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
    SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
    TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
    COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
    CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
    COLLATIONS表:提供了关于各字符集的对照信息。
    COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
    TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
    KEY_COLUMN_USAGE表:描述了具有约束的键列。
    ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
    VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
    TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
information_schema
mysql:这个是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
mysql
mysql 5.5 版本 新增了一个性能优化的引擎: PERFORMANCE_SCHEMA这个功能默认是关闭的: 需要设置参数: performance_schema 才可以启动该功能,这个参数是静态参数,只能写在my.ini 中 不能动态修改。 先看看有什么东西吧:
    mysql> use performance_schema;
    Database changed
    mysql> show tables ;
    +----------------------------------------------+
    | Tables_in_performance_schema |
    +----------------------------------------------+
    | cond_instances |
    | events_waits_current |
    | events_waits_history |
    | events_waits_history_long |
    | events_waits_summary_by_instance |
    | events_waits_summary_by_thread_by_event_name |
    | events_waits_summary_global_by_event_name |
    | file_instances | | file_summary_by_event_name |
    | file_summary_by_instance |
    | mutex_instances |
    | performance_timers |
    | rwlock_instances |
    | setup_consumers |
    | setup_instruments |
    | setup_timers |
    | threads |
    +----------------------------------------------+
    17 rows in set (0.00 sec)
    这里的数据表分为几类:
      1) setup table : 设置表,配置监控选项。
      2) current events table : 记录当前那些thread 正在发生什么事情。
      3) history table 发生的各种事件的历史记录表
      4) summary table 对各种事件的统计表
      5) 杂项表,乱七八糟表。
    setup 表:
      mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE 'setup%';
      +-------------------+
      | TABLE_NAME |
      +-------------------+
      | setup_consumers |
      | setup_instruments |
      | setup_timers |
      +-------------------+
      setup_consumers 描述各种事件 setup_instruments 描述这个数据库下的表名以及是否开启监控。 setup_timers 描述 监控选项已经采样频率的时间间隔
performance_schema
test作用介绍: 
  这个是安装时候创建的一个测试数据库,和它的名字一样,是一个完全的空数据库,没有任何表,可以删除。
test

MySQL简单使用

     数据库里面的指令必须用";"号结尾,才能执行

  • 开启服务端:net start mysql
  • 连接客户端:mysql -u root -p                           (初始root用户没有密码,回车就能连上)
  • 显示数据库:show databases;
  • 创建库:create database 库名;                         (不分大小写,统一会变成小写)
  • 切换到库:use 库名;
  • 创建表:create table 表名();                             如create table student(id int, name char(10), age int);
  • 显示表:show tables;
  • 向表里写入数据:insert into 表名 values();       如insert into student values(1, "Tom", 18), (2, "Linda", 18);
  • 查看表里数据:select * from 表名;

root用户密码设置

root用户密码设置

用SET PASSWORD命令

  • 首先开启服务端(net start mysql),登录mysql自带客户端(mysql -uroot -p)
  • 格式:set password for 用户名@localhost = password("新密码");
  • 例:set password fro root@localhost = password("123");

用mysqladmin

    格式:mysqladmin -u用户名 -p password 新密码

    mysqladmin是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库、修改用户密码等等功能。虽然mysqladmin的很多功能通过使用MySQL自带的mysql客户端可以搞定,但是有时候使用mysqladmin操作会比较简单。

步聚:

  • 首先开启服务端(net start mysql)
  • 登录mysql自带客户端:mysqladmin -uroot -p password 666
  • 再输入旧密码

    此种方法修改密码不安全,可通过doskey/history查看历史命令记录:

用UPDATE直接编辑mysql库中的user表

    格式:update user set password = password("新密码") where user = "root" and host = "localhost";

  • 登录MySQL,连接MySQL服务端(net start mysql)
  • 连接客户端(mysql -uroot -p)
  • 切换到mysql库(use mysql;)
  • 修改密码:update user set password = password("123") where user = "root" and host = "localhost";
  • flush privileges;  刷新权限,让其生效,否则不生效,修改不成功

修改字符集编码

乱码现象

    使用数据库时,如果客户端与服务端编码不同则会出现乱码问题。

    通过命令"\s"可查看MySQL的一些初始化信息:

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.6.42, for Win64 (x86_64)

Connection id:          1
Current database:       day02
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.42 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1  # 服务端编码
Db     characterset:    utf8
Client characterset:    gbk      # 客户端编码
Conn.  characterset:    gbk     
TCP port:               3306
Uptime:                 3 min 44 sec

Threads: 1  Questions: 17  Slow queries: 0  Opens: 68  Flush tables: 1  Open tables: 61  Queries per second avg: 0.075
--------------
MySQ初始化信息

    各个角色的编码(客户端、服务端、数据库等):show variables like "%char%";

mysql> show variables like "%char%";
+--------------------------+------------------------------------------------------------+
| Variable_name            | Value                                                      |
+--------------------------+------------------------------------------------------------+
| character_set_client     | gbk                                                        |
| character_set_connection | gbk                                                        |
| character_set_database   | utf8                                                       |
| character_set_filesystem | binary                                                     |
| character_set_results    | gbk                                                        |
| character_set_server     | latin1                                                     |
| character_set_system     | utf8                                                       |
| character_sets_dir       | E:\Program Files\Mysql\mysql-5.6.42-winx64\share\charsets\ |
+--------------------------+------------------------------------------------------------+
8 rows in set (0.00 sec)
各个角色的编码
 MySQL中的字符集都对应着一个默认的校对规则(collation),当然一个字符集也可能对应着多个校对规则,可是两个不同的字符集不能对应同一个规则。使用默认的就可以了。

character_set_client: server解析client端sql语句的字符集

character_set_connection: 字符串字面值(literal strings)的字符集

character_set_database: 默认数据库的字符集编码。默认数据库的字符集编码.假设没有默认数据库,则该变量值与character_set_server同样.事实上这个值代表的就是你当前数据库的编码而已,比方使用"use test",而test数据库的编码为latin1的话,这个值就是latin1.而你切换的时候"use test2",则character_set_database的值就是数据库test2的编码.

character_set_filesystem:文件系统字符集编码,主要解析用于文件名称的字符串字面值。如LOAD DATA INFILE和SELECT ...INTO OUTFILE等语句以及LOAD_FILE()函数.在打开文件之前,文件名称会从character_set_client转换为character_set_filesystem指定的编码.默认值为binary,也就是说不会进行转换.比如我们设置的character_set_client=GBK,而character_set_filesystem为默认值的话,则采用SELECT...INTO OUTFILE "文件名称",文件名称为GBK编码.反之,假设我们设置了character_set_filesystem=UTF8,则导出的文件名称为UTF8编码. 比如:linux系统的终端编码是UTF8,系统默认语言和编码为zh_CN.UTF8.我们有一个数据库名为test,test中有个表名为t1,编码为latin1,另外,我们在mysqlclient运行了SET NAMES GBK,假设我们不改动character_set_filesystem的值,运行SELECT * FROM t1 INTO OUTFILE '文件1', 能够发现相应的文件夹以下生成了一个名为"文件1"的文件,那文件名称编码是什么呢?事实上这里有几个地方须要注意,首先,我们的sql语句里面的"文件1"原生编码就是终端编码UTF8,也就是'\xe6\x96\x87\xe4\xbb\xb61',而导出数据的语句SELECT * FROM t1 INTO OUTFILE '文件1',依照前面的说法,由于character_set_filesystem为binary,因此'\xe6\x96\x87\xe4\xbb\xb61'不会转换,这样终于还是'\xe6\x96\x87\xe4\xbb\xb61',这样在zh_CN.UTF8的系统中文件名称不会乱码.而假设我们设置了character_set_filesystem=UTF8,则原生的'\xe6\x96\x87\xe4\xbb\xb61'会先依照GBK解码,然后用UTF8编码,最后的结果是"\xe9\x8f\x82\xe5\x9b\xa6\xe6\xac\xa21",这样文件名称就会乱码了.所以这个变量也最好不要改动,用默认值就OK.

character_set_results: server返回给客户端的查询结果或者错误提示的字符集编码。

character_set_server: 服务器默认字符集编码,如果创建数据库里没有指定编码,则采用character_set_server指定编码。

character_set_system: mysqlserver用来存储元数据的编码,通常是utf-8

character_sets_dir: mysql字符集编码存储文件夹



MySQL连接字符集转换包含三个步聚:
1. character_set_client 是client发送过来的sql语句的编码,由于服务端本身并不知道client的sql语句的编码是什么,所以会以这个变量作为client sql语句的初始编码,而服务端接收到sql语句后,则会将sql语句转换为character_set_connection指定的编码(对于字面值字符串,如果前面有introducer标记如latin1或utf-8,则不会进行这一些转换)。转换完毕,才会真正运行sql语句。
2. 进行内部操作羊将sql语句中的数据从character_set_connection转换为数据表中对应字段的编码。
3. 将操作结果从内部字符集编码转换为character_set_results编码



MySQL字符集编码层次:服务端 --> 数据库 --> 表 --> 字段
    服务器编码就是character_set_server来指定的,当我们创建数据库里能自行指定编码,如果没有指定,就采用character_set_server指定的编码。
    MySQL表在创建时也能够自行指定编码,如果不指定则默认采用数据库编码。
    MySQL中字段在创建时也可自行指定编码,如果不指定则默认采用表编码。
各角色编码详细解释

 

 

乱码原因

 

 

 解决方案

临时方案

永久方案

    mysql规定,在mysql启动时,如果没有指定字符集,则按自己程序中写好的字符集来运行。

    如果需要永久更改mysql字符集(不管是客户端还是服务端),就需要在mysql启动前批定好。包含字符集配置文件在Win10中叫my.ini,nuix中叫my.cnf。这个文件是mysql启动时加载的一些用户自定制配置的文件,除更改字符集外,还能填写一些自己想要定制的其他内容。

 

    

 

posted @ 2018-12-05 17:21  Ethan_Y  阅读(110)  评论(0)    收藏  举报