From 3f46ca27d22c51fcf8e06e2375c4253a2519d5f9 Mon Sep 17 00:00:00 2001 From: pengshiyu <1940607002@qq.com> Date: Mon, 21 Mar 2022 22:05:26 +0800 Subject: [PATCH] fix --- blog/php-mysql/index.md | 4 ++ blog/php-mysql/sql-datetime.md | 94 ++++++++++++++++++++++++ blog/php-mysql/sql-float.md | 54 +++++++++++++- blog/php-mysql/sql-string.md | 128 +++++++++++++++++++++++++++++++++ 4 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 blog/php-mysql/sql-datetime.md create mode 100644 blog/php-mysql/sql-string.md diff --git a/blog/php-mysql/index.md b/blog/php-mysql/index.md index 3d75e24..0adef26 100644 --- a/blog/php-mysql/index.md +++ b/blog/php-mysql/index.md @@ -17,3 +17,7 @@ [数据类型-整数](blog/php-mysql/sql-int.md) [数据类型-小数](blog/php-mysql/sql-float.md) + +[数据类型-时间日期类型](blog/php-mysql/sql-datetime.md) + +[数据类型-字符串类型](blog/php-mysql/sql-string.md) diff --git a/blog/php-mysql/sql-datetime.md b/blog/php-mysql/sql-datetime.md new file mode 100644 index 0000000..fb0d221 --- /dev/null +++ b/blog/php-mysql/sql-datetime.md @@ -0,0 +1,94 @@ +## 时间日期类型 + + +类型 | 名称 | 存储字节数| 格式 | 表示范围 | 初始值 +- | - | - | - | - | - +Date | 日期类型 | 3字节 | `YYYY-mm-dd` | `1000-01-01~9999-12-12` | `0000-00-00` +Time | 时间类型 | 3字节 | `HH:ii:ss` | `-838:59:59~838:59:59` | +Datetime | 日期时间类型 | 8字节 | `YYYY-mm-dd HH:ii:ss` | `1000-01-01 00:00:00 ~ 9999-12-12 23:59:59` | `0000-00-00 00:00:00` | +Timestamp | 时间戳类型 | | `YYYY-mm-dd HH:ii:ss` | 表示从格林威治时间开始 +Year| 年类型 | 1字节 | `0~99`/ 四位数具体年 | `1900-2155` + +特殊性: + +1、year 插入2位数,有如下规则 + +- 69以下为20+ +- 70以上为19+ + +2、timestamp可以自动更新 +```sql +timestamp null default current_timestamp on update current_timestamp +``` + +3、time可以存放小时超过24的值 + +4、时间time,可以使用简单的`日期 + 空格 + 数字`,会自动转换该数字成`天数*24 + 后面的时间` + +示例 + +```sql +create table my_date( + date_field date, + time_field time, + datetime_field datetime, + timestamp_field timestamp, + year_field year +); + +mysql> desc my_date; ++-----------------+-----------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-----------------+-----------+------+-----+---------+-------+ +| date_field | date | YES | | NULL | | +| time_field | time | YES | | NULL | | +| datetime_field | datetime | YES | | NULL | | +| timestamp_field | timestamp | YES | | NULL | | +| year_field | year(4) | YES | | NULL | | ++-----------------+-----------+------+-----+---------+-------+ + +-- 插入正常数据 +insert into +my_date(date_field, time_field, datetime_field, timestamp_field, year_field) +values ('1970-01-01', '10:12:12', '1970-01-01 10:12:12', '1970-01-01 10:12:12', 1970); + +mysql> select * from my_date; ++------------+------------+---------------------+---------------------+------------+ +| date_field | time_field | datetime_field | timestamp_field | year_field | ++------------+------------+---------------------+---------------------+------------+ +| 1970-01-01 | 10:12:12 | 1970-01-01 10:12:12 | 1970-01-01 10:12:12 | 1970 | ++------------+------------+---------------------+---------------------+------------+ + +-- 插入time小时数超过24 +insert into +my_date(date_field, time_field, datetime_field, timestamp_field, year_field) +values ('1970-01-01', '512:12:12', '1970-01-01 10:12:12', '1970-01-01 10:12:12', 50); + +mysql> select * from my_date; ++------------+------------+---------------------+---------------------+------------+ +| date_field | time_field | datetime_field | timestamp_field | year_field | ++------------+------------+---------------------+---------------------+------------+ +| 1970-01-01 | 10:12:12 | 1970-01-01 10:12:12 | 1970-01-01 10:12:12 | 1970 | +| 1970-01-01 | 512:12:12 | 1970-01-01 10:12:12 | 1970-01-01 10:12:12 | 2050 | ++------------+------------+---------------------+---------------------+------------+ + +-- time格式转换 +insert into +my_date(date_field, time_field, datetime_field, timestamp_field, year_field) +values ('1970-01-01', '5 12:12:12', '1970-01-01 10:12:12', '1970-01-01 10:12:12', 50); + +mysql> select * from my_date; ++------------+------------+---------------------+---------------------+------------+ +| date_field | time_field | datetime_field | timestamp_field | year_field | ++------------+------------+---------------------+---------------------+------------+ +| 1970-01-01 | 10:12:12 | 1970-01-01 10:12:12 | 1970-01-01 10:12:12 | 1970 | +| 1970-01-01 | 512:12:12 | 1970-01-01 10:12:12 | 1970-01-01 10:12:12 | 2050 | +| 1970-01-01 | 132:12:12 | 1970-01-01 10:12:12 | 1970-01-01 10:12:12 | 2050 | ++------------+------------+---------------------+---------------------+------------+ +``` + +PHP中的时间转换函数 +- 字符串转时间戳 strtotime +- 时间戳转字符串 date + +通常使用int保存时间戳 diff --git a/blog/php-mysql/sql-float.md b/blog/php-mysql/sql-float.md index 5e18f30..a5557a2 100644 --- a/blog/php-mysql/sql-float.md +++ b/blog/php-mysql/sql-float.md @@ -89,9 +89,57 @@ select * from my_float; +---------+--------------+ ``` -- double 双精度,8字节存储,15位精度 +## double 双精度 +8个字节存储,表示范围更大,精度有15位左右 -定点型 +## 定点数decimal -https://www.bilibili.com/video/BV1Vx411g7uJ?p=17&spm_id_from=pageDriver \ No newline at end of file +能够保证数据精确的小数(小数部分可能不精确,超出长度会四舍五入),整数部分一定精确 + +decimal(M, D), M表示总长度,最大值不能超过65,D代表小数部分长度,最长不能超过30 + +```sql +create table my_decimal( + float_data float(10, 2), + decimal_data decimal(10, 2) +); + +mysql> desc my_decimal; ++--------------+---------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------------+---------------+------+-----+---------+-------+ +| float_data | float(10,2) | YES | | NULL | | +| decimal_data | decimal(10,2) | YES | | NULL | | ++--------------+---------------+------+-----+---------+-------+ + +insert into +my_decimal(float_data, decimal_data) +values(12345678.90, 12345678.90); + +mysql> select * from my_decimal; ++-------------+--------------+ +| float_data | decimal_data | ++-------------+--------------+ +| 12345679.00 | 12345678.90 | ++-------------+--------------+ + +insert into +my_decimal(float_data, decimal_data) +values(99999999.99, 99999999.99); + + +mysql> select * from my_decimal; ++--------------+--------------+ +| float_data | decimal_data | ++--------------+--------------+ +| 12345679.00 | 12345678.90 | +| 100000000.00 | 99999999.99 | ++--------------+--------------+ + +-- 定点数,整数部分被进位,会抛出异常 +insert into +my_decimal(float_data, decimal_data) +values(99999999.99, 99999999.999); +ERROR 1264 (22003): Out of range value for column 'decimal_data' at row 1 +``` diff --git a/blog/php-mysql/sql-string.md b/blog/php-mysql/sql-string.md new file mode 100644 index 0000000..c459929 --- /dev/null +++ b/blog/php-mysql/sql-string.md @@ -0,0 +1,128 @@ +## 字符串类型 + +## char 和 varchar + +1、char 定长字符 + +char(L) L 代表字符数(0-255) + +2、varchar 变长字符 + +varchar(L) L 代表字符数(0-65535) + +每个 varchar 数据,都会增加 1-2 个字节来保存数据所占用的空间长度 + +- 数据本身小于 127 个字符,额外开销 1 个字节 +- 数据本身大于 127 个字符,额外开销 2 个字节 + +char 和 varchar 对比, utf8,一个字符都会占用 3 个字节 + +| 存储数据 | char(2) | varchar(2) | char 所占字节 | varchar 所占字节 | +| -------- | ------- | ---------- | ------------- | ---------------- | +| A | A | A | `2 * 3 = 6` | `1 * 3 + 1 = 4` | +| AB | AB | AB | `2 * 3 = 6` | `2 * 3 + 1 = 7` | + +char 和 varchar 区别 + +- char 一定会使用指定的空间,varchar 根据数据来定空间 +- char 的数据查询效率比 varchar 高,varchar 需要通过后面的记录数来计算 + +char 和 varchar 选择 + +- 如果确定数据的长度,使用 char +- 不确定数据的长度,使用 varchar +- 如果数据长度超过 255 个字符,一般使用 text + +## text 文本类型 + +- text 存储普通的字符文本 +- blob 存储二进制文件(图片,文件),一般不使用,通常使用一个连接来指向对应的文件 + +| 类型 | 字节数 | 实际存储数据量 | +| ---------- | -------- | -------------- | +| tinytext | 1 个字节 | `2^8 + 1` | +| text | 2 个字节 | `2^16 + 2` | +| mediumtext | 3 个字节 | `2^24 + 3` | +| longtext | 4 个字节 | `2^32 + 4` | + +注意: + +1、不用刻意选择 text 类型,系统会自动根据存储的数据长度来选择合适的文本类型 + +2、如果数据超过 255 个字符,一定选择 text + +## enum 枚举类型 + +例如: +``` +性别 gender 男 女 保密 +``` +基本语法 +``` +enum(数据值 1,数据值 2...); +``` +- 数据值列表在 255 个以内,使用 1 个字节来存储 +- 数据值列表超过 255,但是小于 65535,使用 2 个字节来存储 + +```sql +-- Enum(0=>'男', 1=>'女', 2=>'保密') +create table my_enum( + gender enum('男', '女', '保密') +) + +mysql> desc my_enum; ++--------+----------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------+----------------------------+------+-----+---------+-------+ +| gender | enum('男','女','保密') | YES | | NULL | | ++--------+----------------------------+------+-----+---------+-------+ + +-- 插入规范数据 +insert into my_enum (gender) values ('男'); +insert into my_enum (gender) values ('女'); + +mysql> select * from my_enum; ++--------+ +| gender | ++--------+ +| 男 | +| 女 | ++--------+ + +``` + +枚举可以规范数据 + +枚举类型存储的不是真正的字符串,而是存储了下标 +```sql +-- MySQL 会自动类型转换,+、-、\*、/ 会将数据转换成数值,普通字符串转换为数值 0 +select gender + 0 from my_enum; + +mysql> select gender + 0 from my_enum; ++------------+ +| gender + 0 | ++------------+ +| 1 | +| 2 | ++------------+ + +-- 可以直接插入数值数据 +insert into my_enum (gender) values (1); + +mysql> select * from my_enum; ++--------+ +| gender | ++--------+ +| 男 | +| 女 | +| 男 | ++--------+ + +``` + +枚举的意义 + +- 规范数据本身,限定只能插入规定的数据项 +- 节省存储空间 + +https://www.bilibili.com/video/BV1Vx411g7uJ?p=22&spm_id_from=pageDriver -- GitLab