当前位置:网站首页>MySQL高級篇第一章(linux下安裝MySQL)【下】

MySQL高級篇第一章(linux下安裝MySQL)【下】

2022-06-26 03:41:00 緣友一世

一 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
[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.

2 方法二:開放端口

  • 查看開放的端口號
firewall-cmd --list-all

設置開放的端口號

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

重啟防火牆

firewall-cmd --reload

    1. Linux下修改配置
use mysql;
select Host,User from user;
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)

可以看到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)

Host修改完成後記得執行flush privileges使配置立即生效:

flush privileges;

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.1.5 測試

如果是 MySQL8 版本,連接時還會出現如下問題:
在這裏插入圖片描述
解决方法:Linux下 mysql -u root -p 登錄你的 mysql 數據庫,然後 執行這條SQL:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密碼';

然後在重新配置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%';

mysql5.7 的默認字符集

在這裏插入圖片描述

mysql8.0的默認字符集

在這裏插入圖片描述
MySQL 5.7 默認的客戶端和服務器都用了 latin1 ,不支持中文,保存中文會報錯

操作2:修改字符集

vim /etc/my.cnf

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

character_set_server=utf8

在這裏插入圖片描述
在這裏插入圖片描述

操作3:重新啟動MySQL服務

systemctl restart mysqld

但是原庫、原錶的設定不會發生變化,參數修改只對新建的數據庫生效。

2.2 各級別的字符集

MySQL有4個級別的字符集和比較規則,分別是:

  • 服務器級別
  • 數據庫級別
  • 錶級別
  • 列級別
    執行如下SQL語句:
show variables like 'character%';

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. 數據庫級別
    character_set_database :當前數據庫的字符集
    在創建和修改數據庫的時候可以指定該數據庫的字符集和比較規則
CREATE DATABASE 數據庫名
	[[DEFAULT] CHARACTER SET 字符集名稱]
	[[DEFAULT] COLLATE 比較規則名稱];

ALTER DATABASE 數據庫名
	[[DEFAULT] CHARACTER SET 字符集名稱]
	[[DEFAULT] COLLATE 比較規則名稱];

  1. 錶級別
    我們也可以在創建和修改錶的時候指定錶的字符集和比較規則,語法如下:
CREATE TABLE 錶名 (列的信息)
	[[DEFAULT] CHARACTER SET 字符集名稱]
	[COLLATE 比較規則名稱]]

ALTER TABLE 錶名
	[[DEFAULT] CHARACTER SET 字符集名稱]
	[COLLATE 比較規則名稱]

如果創建和修改錶的語句中沒有指明字符集和比較規則,將使用該錶所在數據庫的字符集和比較規則作
為該錶的字符集和比較規則。

  1. 列級別
    對於存儲字符串的列,同一個錶中的不同的列也可以有不同的字符集和比較規則。我們在創建和修改列
    定義的時候可以指定該列的字符集和比較規則,語法如下:
CREATE TABLE 錶名(
	列名 字符串類型 [CHARACTER SET 字符集名稱] [COLLATE 比較規則名稱],
	其他列...
);
ALTER TABLE 錶名 MODIFY 列名 字符串類型 [CHARACTER SET 字符集名稱] [COLLATE 比較規則名稱];

對於某個列來說,如果在創建和修改的語句中沒有指明字符集和比較規則,將使用該列所在錶的字符集
和比較規則作為該列的字符集和比較規則。

提示
在轉換列的字符集時需要注意,如果轉換前列中存儲的數據不能用轉換後的字符集進行錶示會發生
錯誤。比方說原先列使用的字符集是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%'

lower_case_table_names參數值的設置:
默認為0,大小寫敏感 。

  • 設置1,大小寫不敏感。創建的錶,數據庫都是以小寫形式存放在磁盤上,對於sql語句都是轉
    換為小寫對錶和數據庫進行查找。
  • 設置2,創建的錶和數據庫依據語句上格式存放,凡是查找都是轉換為小寫進行。

兩個平臺上SQL大小寫的區別具體來說:

MySQL在Linux下數據庫名、錶名、列名、別名大小寫規則是這樣的:
1、數據庫名、錶名、錶的別名、變量名是嚴格區分大小寫的;
2、關鍵字、函數名稱在 SQL 中不區分大小寫;
3、列名(或字段名)與列的別名(或字段別名)在所有的情况下均是忽略大小寫的;
MySQL在Windows的環境下全部不區分大小寫

3.2 SQL編寫建議

如果你的變量名命名規範沒有統一,就可能產生錯誤。這裏有一個有關命名規範的建議:

  1. 關鍵字和函數名稱全部大寫;
  2. 數據庫名、錶名、錶別名、字段名、字段別名等全部小寫;
  3. SQL 語句必須以分號結尾。
原网站

版权声明
本文为[緣友一世]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/177/202206260315432109.html