mysql基礎-01
typora-copy-images-to: images
1.1 今日目標
- 掌握資料庫的作用;
- 能夠通俗的解釋什麼是關係型資料庫;
- 能夠至少說出三種關係型資料庫;
- 掌握MySQL客戶端登入和登出MySQL伺服器;
- 理解資料庫具體資料的儲存邏輯;
- 掌握建立、檢視和刪除資料庫;
- 瞭解MySQL資料庫建立與刪除指令對應的檔案效果
- 掌握資料表的增刪改查操作;
- 掌握資料的增刪改查操作;
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:\wamp\PHPTutorial\MySQL\bin>mysql -h127.0.0.1 -P3306 -uroot -proot -- 明文
-- 如果連線本地資料庫 -h可以省略 如果伺服器埠是3306,-P埠號也可以省略
F:\wamp\PHPTutorial\MySQL\bin>mysql -uroot -proot -- 明文
-- 密文
F:\wamp\PHPTutorial\MySQL\bin>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.4.2 資料相關
1、資料冗餘:相同的資料儲存在不同的地方
冗餘只能減少,不能杜絕。
減少冗餘的方法是分表
2、資料完整性:正確性+準確性=資料完整性:兩個Mary Beth的Address不一樣,以後就說資料不完整
正確性:資料型別正確
準確性:資料範圍要準確
思考:學生的年齡是整型,輸入1000歲,正確性和準確性如何?
答:正確的,但不準確。失去了資料完整性(具體是資料範圍不對,但是統稱資料不完整)。
1.4.3 資料庫執行過程
1.5 資料庫的操作
1.5.1 建立資料庫
先開啟命令列連線資料庫:F:\wamp\PHPTutorial\MySQL\bin>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_enviroment\PHPTutorial\MySQL\data\data
.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:不區分大小寫