• MySQL高级篇第一章(linux下安装MySQL)【下】


    一 MYSQL登录

    1.1 设置远程登陆

    1.1.1 遇到错误问题

    在这里插入图片描述

    1.1.2 原因

    由于Mysql配置了不支持远程连接引起的

    1.1.3 确认网络

    1 在远程机器上使用ping ip地址 保证网络畅通

    在这里插入图片描述
    如上图,显示我的网络通常。
    在这里插入图片描述

    2 在远程机器上使用telnet命令 保证端口号开放 访问端口

    在这里插入图片描述- 3. 关闭防火墙或者开放

    1.1.4 关闭防火墙或开放端口

    1 方法一:关闭防火墙【推荐】

    systemctl start firewalld.service
    
    systemctl status firewalld.service
    
    systemctl stop firewalld.service
    
    #设置开机启用防火墙
    systemctl enable firewalld.service
    
    #设置开机禁用防火墙
    systemctl disable firewalld.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    [root@atguigu ~]# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since 三 2022-06-22 22:06:26 CST; 26min ago
         Docs: man:firewalld(1)
     Main PID: 719 (firewalld)
        Tasks: 2
       CGroup: /system.slice/firewalld.service
               └─719 /usr/bin/python2 -Es /usr/sbin/firewalld --no...
    
    622 22:06:24 atguigu systemd[1]: Starting firewalld - dyna...
    622 22:06:26 atguigu systemd[1]: Started firewalld - dynam...
    622 22:06:26 atguigu firewalld[719]: WARNING: AllowZoneDri...
    Hint: Some lines were ellipsized, use -l to show in full.
    [root@atguigu ~]# systemctl stop firewalld
    [root@atguigu ~]# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: inactive (dead) since 三 2022-06-22 22:33:47 CST; 11s ago
         Docs: man:firewalld(1)
      Process: 719 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
     Main PID: 719 (code=exited, status=0/SUCCESS)
    
    622 22:06:24 atguigu systemd[1]: Starting firewalld - dyna...
    622 22:06:26 atguigu systemd[1]: Started firewalld - dynam...
    622 22:06:26 atguigu firewalld[719]: WARNING: AllowZoneDri...
    622 22:33:47 atguigu systemd[1]: Stopping firewalld - dyna...
    622 22:33:47 atguigu systemd[1]: Stopped firewalld - dynam...
    Hint: Some lines were ellipsized, use -l to show in full.
    [root@atguigu ~]# systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2 方法二:开放端口

    • 查看开放的端口号
    firewall-cmd --list-all
    
    • 1

    设置开放的端口号

    firewall-cmd --add-service=http --permanent
    firewall-cmd --add-port=3306/tcp --permanent
    
    • 1
    • 2

    重启防火墙

    firewall-cmd --reload
    
    
    • 1
    • 2
      1. Linux下修改配置
    use mysql;
    select Host,User from user;
    
    • 1
    • 2
    mysql> use mysql;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select host,user from user;
    +-----------+------------------+
    | host      | user             |
    +-----------+------------------+
    | localhost | mysql.infoschema |
    | localhost | mysql.session    |
    | localhost | mysql.sys        |
    | localhost | root             |
    +-----------+------------------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    可以看到root用户的当前主机配置信息为localhost。

    • 修改Host为通配符%

    Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1。这里的意思就是说root用户只能通过192.168.1.1的客户端去访问。 user=root Host=localhost,表示只能通过本机客户端去访问。而 %是个 通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连
    接。如果 Host=% ,表示所有IP都有连接权限。

    
    mysql> update user set host='%' where user='root';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select host,user from user;
    +-----------+------------------+
    | host      | user             |
    +-----------+------------------+
    | %         | root             |
    | localhost | mysql.infoschema |
    | localhost | mysql.session    |
    | localhost | mysql.sys        |
    +-----------+------------------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Host修改完成后记得执行flush privileges使配置立即生效:

    flush privileges;
    
    • 1
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yqk.20021027';
    Query OK, 0 rows affected (0.01 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.1.5 测试

    如果是 MySQL8 版本,连接时还会出现如下问题:
    在这里插入图片描述
    解决方法:Linux下 mysql -u root -p 登录你的 mysql 数据库,然后 执行这条SQL:

    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';
    
    • 1

    然后在重新配置SQLyog的连接,则可连接成功了,OK。
    密码强度最好高一点。

    二 字符集的相关操作

    2.1 修改MySQL5.7字符集

    1. 修改步骤
      在MySQL 8.0版本之前,默认字符集为 latin1 ,utf8字符集指向的是 utf8mb3 。网站开发人员在数据库
      设计的时候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL
      8.0开始,数据库的默认编码将改为 utf8mb4 ,从而避免上述乱码的问题。

    操作1:查看默认使用的字符集

    show variables like 'character%';
    # 或者
    show variables like '%char%';
    
    • 1
    • 2
    • 3

    mysql5.7 的默认字符集

    在这里插入图片描述

    mysql8.0的默认字符集

    在这里插入图片描述
    MySQL 5.7 默认的客户端和服务器都用了 latin1 ,不支持中文,保存中文会报错

    操作2:修改字符集

    vim /etc/my.cnf
    
    • 1

    在MySQL5.7或之前的版本中,在文件最后加上中文字符集配置:

    character_set_server=utf8
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    操作3:重新启动MySQL服务

    systemctl restart mysqld
    
    • 1

    但是原库、原表的设定不会发生变化,参数修改只对新建的数据库生效。

    2.2 各级别的字符集

    MySQL有4个级别的字符集和比较规则,分别是:

    • 服务器级别
    • 数据库级别
    • 表级别
    • 列级别
      执行如下SQL语句:
    show variables like 'character%';
    
    
    • 1
    • 2
    Variable_name解释
    character_set_server服务器级别的字符集
    character_set_database当前数据库的字符集
    character_set_client服务器解码请求时使用的字符集
    character_set_connection服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
    character_set_results服务器向客户端返回数据时使用的字符集
    1. 服务器级别
      character_set_server :服务器级别的字符集。
      我们可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用 SET 语句修改这两个变量
      的值。比如我们可以在配置文件中这样写:
    [server]
    character_set_server=gbk # 默认字符集
    collation_server=gbk_chinese_ci #对应的默认的比较规则
    
    • 1
    • 2
    • 3

    当服务器启动的时候读取这个配置文件后这两个系统变量的值便修改了。

    1. 数据库级别
      character_set_database :当前数据库的字符集
      在创建和修改数据库的时候可以指定该数据库的字符集和比较规则
    CREATE DATABASE 数据库名
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[[DEFAULT] COLLATE 比较规则名称];
    
    ALTER DATABASE 数据库名
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[[DEFAULT] COLLATE 比较规则名称];
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 表级别
      我们也可以在创建和修改表的时候指定表的字符集和比较规则,语法如下:
    CREATE TABLE 表名 (列的信息)
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[COLLATE 比较规则名称]]
    
    ALTER TABLE 表名
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[COLLATE 比较规则名称]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作
    为该表的字符集和比较规则。

    1. 列级别
      对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。我们在创建和修改列
      定义的时候可以指定该列的字符集和比较规则,语法如下:
    CREATE TABLE 表名(
    	列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
    	其他列...
    );
    ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
    
    • 1
    • 2
    • 3
    • 4
    • 5

    对于某个列来说,如果在创建和修改的语句中没有指明字符集和比较规则,将使用该列所在表的字符集
    和比较规则作为该列的字符集和比较规则。

    提示
    在转换列的字符集时需要注意,如果转换前列中存储的数据不能用转换后的字符集进行表示会发生
    错误。比方说原先列使用的字符集是utf8,列中存储了一些汉字,现在把列的字符集转换为ascii的
    话就会出错,因为ascii字符集并不能表示汉字字符。

    • 如果 创建或修改列 时没有显式的指定字符集和比较规则,则该列 默认用表的 字符集和比较规则
    • 如果 创建表时 没有显式的指定字符集和比较规则,则该表 默认用数据库的 字符集和比较规则
    • 如果 创建数据库时 没有显式的指定字符集和比较规则,则该数据库 默认用服务器的 字符集和比较规
      则知道了这些规则之后,对于给定的表,我们应该知道它的各个列的字符集和比较规则是什么,从而根据
      这个列的类型来确定存储数据时每个列的实际数据占用的存储空间大小了。

    三 SQL大小写规范

    3.1 Windows和Linux平台区别

    在 SQL 中,关键字和函数名是不用区分字母大小写的,比如 SELECT、WHERE、ORDER、GROUP BY 等关键字,以及 ABS、MOD、ROUND、MAX 等函数名。
    不过在 SQL 中,你还是要确定大小写的规范,因为在 Linux 和 Windows 环境下,你可能会遇到不同的大
    小写问题。 windows系统默认大小写不敏感 ,但是 linux系统是大小写敏感的
    通过如下命令查看:

    SHOW VARIABLES LIKE '%lower_case_table_names%'
    
    • 1

    lower_case_table_names参数值的设置:
    默认为0,大小写敏感 。

    • 设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,对于sql语句都是转
      换为小写对表和数据库进行查找。
    • 设置2,创建的表和数据库依据语句上格式存放,凡是查找都是转换为小写进行。

    两个平台上SQL大小写的区别具体来说:

    MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
    1、数据库名、表名、表的别名、变量名是严格区分大小写的;
    2、关键字、函数名称在 SQL 中不区分大小写;
    3、列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的;
    MySQL在Windows的环境下全部不区分大小写

    3.2 SQL编写建议

    如果你的变量名命名规范没有统一,就可能产生错误。这里有一个有关命名规范的建议:

    1. 关键字和函数名称全部大写;
    2. 数据库名、表名、表别名、字段名、字段别名等全部小写;
    3. SQL 语句必须以分号结尾。
  • 相关阅读:
    聚类算法模型评价指标
    vue2.x 迭代更新项目去掉缓存处理
    Kubernetes学习笔记-StatefulSet:部署有状态的多副本应用(3)20220626
    JS 使用Reg表达式匹配后直接取值
    【开发规范】
    计算机毕业设计ssm+vue基本微信小程序的智能图书管理系统
    uniapp-chatgpt跨端仿ChatGPT实例|uniapp+vue3+pinia多端聊天模板
    海康威视工业相机MAC地址
    【Java 进阶篇】HTML 图片标签详解
    linux 里面卸载jdk
  • 原文地址:https://blog.csdn.net/yang2330648064/article/details/125207440