1. 程式人生 > 實用技巧 >mysql基礎-01

mysql基礎-01


typora-copy-images-to: images


1.1 今日目標

  1. 掌握資料庫的作用;
  2. 能夠通俗的解釋什麼是關係型資料庫;
  3. 能夠至少說出三種關係型資料庫;
  4. 掌握MySQL客戶端登入和登出MySQL伺服器;
  5. 理解資料庫具體資料的儲存邏輯;
  6. 掌握建立、檢視和刪除資料庫;
  7. 瞭解MySQL資料庫建立與刪除指令對應的檔案效果
  8. 掌握資料表的增刪改查操作;
  9. 掌握資料的增刪改查操作;

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. 資料庫:資料庫中存放的是表,一個數據庫中可以存放多個表

  2. 表:表是用來存放資料的。

  3. 關係:兩個表的公共欄位

  4. 行:也稱記錄,也稱實體,就是一行的資料

  5. 列:也稱欄位,也稱屬性,豎的就是一列

腳下留心:就表結構而言,表分為行和列;就表資料而言,表分為記錄和欄位;就面向物件而言,一個記錄即一行就是一個實體(也就是物件),一個欄位(一列)就是一個屬性(物件有自己的屬性)。

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:不區分大小寫