MySQL中的編碼和數據類型


1.字符集

  • 1. 字符集在什么時候可以發揮作用?
    • 1. 保存數據的時候需要使用字符集
    • 2. 數據傳輸的時候也需要使用字符集
    • 3. 在存續的時候使用字符集
      • 1. 在MySQL的服務器上, 在數據庫中, 在表的使用上, 在字段的設置上.
      • 2. 在服務器安裝的時候, 可以指定默認的字符集
  • 2. 常見字符集
    • ASCII: 基於羅馬字母表的一套字符集, 它采用1個字節的低7位表示字符, 高位始終為0。
    • LATIN1: 相對於ASCII字符集做了擴展, 仍然使用一個字節表示字符, 但啟用了高位, 擴展了字
    • 符集的表示范圍。
    • GB2312: 簡體中文字符, 一個漢字最多占用2個字節
    • GBK: 只是所有的中文字符, 一個漢字最多占用2個字節
    • UTF8: 國際通用編碼, 一個漢字最多占用3個字節
    • UTF8MB4: 國際通用編碼, 在utf8的基礎上加強了對新文字識別, 一個漢字最多占用4個字節
/* gbk字符集最大字符串長度: 65535/2 -1 */
create table test(
    text varchar(32766)
) charset=gbk;
/* utf8字符集最大字符串長度: 65535/3 -1 */
create table test1(
    text varchar(21844)
) charset=utf8;
/* utf8mb4字符集最大字符串長度: 65535/4 -1 */
create table test4(
    text varchar(16382)
) charset=utf8mb4;
  • 3. 查看當前mysql系統支持的字符集
mysql> show variables like 'character_%';
/* 輸出:
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| character_set_client | utf8mb4 | 客戶端來源數據使用的字符集
| character_set_connection | utf8mb4 | 連接層字符集
| character_set_database | utf8mb4 | 當前選中的數據庫的默認字符集
| character_set_filesystem | binary | 文件系統字符集
| character_set_results | utf8mb4 | 查詢結果使用的字符集
| character_set_server | utf8mb4 | 默認的內部操作字符集
| character_set_system | utf8 | 系統元數據(字段名、表名等)的字符集
| character_sets_dir | /usr/lo... |
+--------------------------+------------+
*/
  • 4. 修改當前的 mysql 系統的字符集編碼
    • 全部修改
set names gbk;
  • 指定修改
set character_set_client = gbk;
set character_set_results = gbk;
  • 它是臨時性命令, mysql鏈接斷開以后, 再次連接時會恢復原狀。

2.校對集

在某一種字符集下, 為了使字符之間可以互相比較, 讓字符和字符形成一種關系的集合, 稱之為校對集。

比如說 ASCII 中的 a 和 B, 如果區分大小寫 a > B, 如果不區分 a < B;不同字符集有不同的校對規則, 命名約定:以其相關的字符集名開始, 通常包括一個語言名, 並且以_ci 、_cs 或 _bin 結束。

  • _ci : 大小寫不敏感
  • _cs : 大小寫敏感
  • _bin : binary collation 二元法, 直接比較字符的編碼, 可以認為是區分大小寫的, 因為字符集中'A'和'a'的編碼顯然不同。
/* 數據庫默認的排序方式,是升序 */
create table t1(
  str char(1)
) charset=utf8mb4 collate=utf8mb4_general_ci; -- _general_ci 后綴的都是不區分大小寫
的
create table t2(
  str char(1)
) charset=utf8mb4 collate=utf8mb4_bin; -- 看到后綴邊是_bin的都是區分大小的
/*
Linux中Mysql是區分大小的
需要自己去配置
vim /etc/mysql/my.cnf
找到[mysqld]
1是不區分大小寫,0是區分大小寫
*/
lower_case_table_names=1
show character set; -- 查看字符集 和 校對集
show collation; -- 顯示所有的校對集

3.MySQL的數據類型

3.1整型

 

  •  一個無符號數一定是非負數
create table t3(
    age tinyint unsigned
);
  • 顯示寬度 (zerofill),整型顯示寬度, 位數不足時用 0 填充
create table t4(
    id int(10) zerofill primary key auto_increment,
    name char(32)
);
insert into t4 values(12345, '5個');
insert into t4 values(1234567890, '10個');
insert into t4 values(123456789012, '12個');
select * from t4;

3.2浮點數

 

定點數的位數更加長 使用方式:

  • float(M,D)
  • double(M,D)
  • decimal(M,D)
  • M 是支持多少個長度, D 是小數點后面的位數
create table t5 (
    a float(10, 2),
    b double(10, 2),
    c decimal(10, 2)
);

3.3字符串類型

 

CHAR 與 VARCHAR 類型的區別

 

思考:

  • 字符串、浮點型等都可以隨意指定大小, 那么是不是平時操作的時候隨意指定一個就可以呢?
  • 答:不是, 數據類型並不是越大越好, 越大的類型會造成數據臃腫, 存儲空間占用過大, 數據檢索也會變慢

3.4枚舉(enum)

多選一的時候使用的一種數據類型

在前端使用單選框的時候, 枚舉類型可以發揮作用

枚舉類型的優點:

  • 1. 限制了可選值
  • 2. 節省空間
  • 3. 運行效率高
create table t6(
    name varchar(32),
    sex enum('','','保密') default '保密'
);
-- 枚舉類型的計數默認從1開始
insert into t6 set name='王寶強',sex=1;

3.5集合(set)(用的不多)

SET最多可以有64個不同的成員。類似於復選框, 有多少可以選多少。

create table t7 (
    name varchar(32),
    hobby set('','','','','')
);
insert into t7 values('張三','睡,抽,玩,吃,喝');
insert into t7 values('李四','睡,抽');
  • 為什么不是用 set 類型?
    • 在現代網站開發中, 多選框的值有上千個, 值存儲的空間沒有索引用的多
  • 那復選框的問題怎么解決?
    • 將復選框的值單獨設計成一張表

3.6時間類型

 

3.6.1datetime

create table datetime_test (
    create_at datetime
);
insert into datetime_test values('2019-4-2 16:54:00');
insert into datetime_test values('2019/4/2 16:54:00');
insert into datetime_test values(now());
-- 年份最大支持4個長度
insert into datetime_test values('10000/4/2 16:54:00'); -- 錯誤
insert into datetime_test values('9999/4/2 16:54:00');

3.6.2time

create table time_test (
    create_at time
);
insert into time_test values('12:12:12');
insert into time_test values('100:12:12');
insert into time_test values('-100:12:12');
insert into time_test values('10 10:12:12');
-- 時間的范圍是: [-838:59:59 - 838:59:59]
insert into time_test values('839:12:12'); -- 錯誤的

3.6.3timestamp 時間戳類型

  • 時間戳類型在顯示方面和datetime是一樣的, 在存儲上不一樣
  • 范圍從 1970-1-1 0:0:0 到 2038-1-19 11:14:07
  • 時間戳使用 4 個字節表示
  • 該值大小與存儲的位長有關: 2 ** (4 * 8 - 1)
create table timestamp_test (
    create_time timestamp
);
insert into timestamp_test values(now());
insert into timestamp_test values('2038-1-19 11:14:07'); -- 時間戳最大值
insert into timestamp_test values('2038-1-19 11:14:08'); -- 錯誤

3.6.4year

create table `year`(
    create_at year
);
-- 從1900年開始 - 1900+255
insert into `year` values(now());
insert into `year` values('2155'); -- 年份最大值
insert into `year` values('2156'); -- 錯誤

3.7布爾值

mysql中的bool類型也是1和0。

create table `bool`(
    cond boolean
);
insert into `bool` set cond=True; -- 成功
insert into `bool` set cond=False; -- 成功
insert into `bool` set cond=1; -- 成功
insert into `bool` set cond=10; -- 成功
insert into `bool` set cond=-1; -- 成功
insert into `bool` set cond=0; -- 成功
insert into `bool` set cond=0.1; -- 成功
insert into `bool` set cond='True'; -- 失敗

3.8列的屬性

  • 插入的值是否可以為空
    • null : 是可以為空,默認不寫
    • not null : 不可以為空,如果插入的時候,摸個字段的值為空,則報錯
create table null_test (
    id int primary key auto_increment,
    username varchar(32) not null,
    pwd varchar(16) null
);
insert into null_test values(null,null,null);
  • default
    • 默認值一般是和null做搭配的
create table default_test (
    id int primary key auto_increment,
    username varchar(32) default 'admin' not null,
    pwd varchar(16) default 123456
);
insert into default_test (username) values ('admin');
  • auto_increment
    • 自動增長的列
    • 默認從 1 開始
    • 常配合主鍵使用的
create table auto_inc (
    id int primary key auto_increment,
    name varchar(32)
);
insert into auto_inc (name) values ('aaa'), ('bbb'), ('ccc');
select * from auto_inc;
  • primary key
    • 主鍵一般是唯一的標識
    • 特性:不能為空,也不能重復,一張表當中只可以擁有一個主鍵
-- 這里只有一個主鍵,這種主鍵叫做聯合主鍵, 在項目中使用較少
create table double_pri_test (
    id int,
    sid int,
    primary key(id,sid)
);
insert into double_pri_test values (1, 1);
insert into double_pri_test values (1, 2); -- 成功
insert into double_pri_test values (2, 1); -- 成功
insert into double_pri_test values (1, 1); -- 失敗
  • unique
    • 唯一鍵,保證列當中的每一個數據都不重復
    • 郵箱不可以重復,手機號不可以重復
create table test_uniq (
    id int auto_increment primary key,
    mobile char(11) unique
);
insert into test_uniq set mobile=13999999999;
  • comment
    • 字段說明: 給開發者看的, 一般用來對相應字段進行說明
create table test_cmt (
    ctime datetime comment '這個字段代表創建日期'
);

3.9SQL注釋

  • 單行注釋: -- 你好
  • 多行注釋: /* 巴拉巴拉 */
  • MySQL 獨有的單行注釋: # 哈哈哈哈

4.MySQL的運算符

4.1算數運算符

mysql> select 123 + 543, 321 * 5, -456 / 2, 10 % 3, 2 / 0, 3 % 0;
+-----------+---------+-----------+--------+-------+-------+
| 123 + 543 | 321 * 5 | -456 / 2  | 10 % 3 | 2 / 0 | 3 % 0 |
+-----------+---------+-----------+--------+-------+-------+
|       666 |    1605 | -228.0000 |      1 |  NULL |  NULL |
+-----------+---------+-----------+--------+-------+-------+
1 row in set, 2 warnings (0.00 sec)

4.2比較運算符

 

4.2.1常規比較

mysql> select 1=2, 2<3, 3<=4, 4>5, 5>=3, 8!=9, 8<>9, 'abc' = 'Abc', 'z' > 'a';
+-----+-----+------+-----+------+------+------+---------------+-----------+
| 1=2 | 2<3 | 3<=4 | 4>5 | 5>=3 | 8!=9 | 8<>9 | 'abc' = 'Abc' | 'z' > 'a' |
+-----+-----+------+-----+------+------+------+---------------+-----------+
|   0 |   1 |    1 |   0 |    1 |    1 |    1 |             1 |         1 |
+-----+-----+------+-----+------+------+------+---------------+-----------+
1 row in set (0.00 sec)

4.2.2范圍比較

mysql> select 123 between 100 and 200, 'b' in ('a', 'b', 'c');
+-------------------------+------------------------+
| 123 between 100 and 200 | 'b' in ('a', 'b', 'c') |
+-------------------------+------------------------+
|                       1 |                      1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)

4.2.3Null比較

mysql> select 12 is null, 23 = null, null = null, null <=> null, null is null, 32 is not null;
+------------+-----------+-------------+---------------+--------------+----------------+
| 12 is null | 23 = null | null = null | null <=> null | null is null | 32 is not null |
+------------+-----------+-------------+---------------+--------------+----------------+
|          0 |      NULL |        NULL |             1 |            1 |              1 |
+------------+-----------+-------------+---------------+--------------+----------------+
1 row in set (0.00 sec)

4.2.4模糊比較: like

mysql> select 'HelloWorld' like 'hello%';
+----------------------------+
| 'HelloWorld' like 'hello%' |
+----------------------------+
|                          1 |
+----------------------------+
1 row in set (0.00 sec)

mysql> 

4.2.5邏輯運算符

mysql> select 1 < 2 and 4 > 3;
+-----------------+
| 1 < 2 and 4 > 3 |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.00 sec)

mysql>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM