类型属性

在介绍数据类型前,先来介绍两个属性:UNSIGNED和
ZEROFILL,是否使用这两个属性对选择数据类型有着莫大的关系。

UNSIGNED

就是无符号的意思。

对于主键是自增长的类型,一般来说,用户都希望主键是非负数。然而在实际使用中,UNSIGNED可能会带来一些负面的影响,示例如下:

CREATE TABLE t_table( a INT UNSIGNED, b INT UNSIGNED) ENGINE = INNODB;
INSERT INTO t_table SELECT 1, 2;

我们创建了一个表,两个字段都是UNSIGNED的INT类型。

接下来执行:
SELECT a-b FROM t_table

答案是什么?在我本机上,答案是:

BIGINT UNSIGNED value is out of range in '(`learn`.`t_table`.`a` - `learn`.`t_table`.`b`)'

产生这个问题的原因是,对于UNSIGNED数的操作,其返回值都是UNSIGNED的。因此,-1在这里无法恰当的表示。

解决方法是设置参数:

SET sql_mode='NO_UNSIGNED_SUBTRACTION';SELECT a-b FROM t_table;

这里建议尽量不要使用UNSIGNED,INT型主键可改为BIGINT类型

ZEROFILL

ZEROFILL属性非常有意思,更像是一个显示的属性。很多初学
者往往对MySQL数据库中数字类型后面的长度值很迷茫。下面通过
SHOW CREATE TABLE命令来看一下t_table表的建表语句。

> SHOW CREATE TABLE t_table> CREATE TABLE `t_table` (`a` int(10) unsigned DEFAULT NULL,`b` int(10) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

可以看到int(10),如果没有ZEROFILL这个属性,括号内的数字是毫无意义的

> SELECT * FROM t_table
>
a: 1
b: 2

在对列添加ZEROFILL属性后,显示的结果就有所不同了

ALTER TABLE t_table CHANGE COLUMN a a int(4) UNSIGNED ZEROFILL
> OK
> Time: 0.01s

这里对a列进行了修改,并添加了ZEROFILL属性,这时再进行查找操作:

> SELECT a,b FROM t_table;
>
> a: 0001
> b: 2

这次可以看到a的值由原来的1变为0001,这就是ZEROFILL属性
的作用,如果宽度小于设定的宽度(这里的宽度为4),则自动填充
0。但在MySQL中实际存储的还是1。

> SELECT (a + 1),b FROM t_table;
>
>(a+1): 2
>b: 2

这里对a执行+1操作,返回的结果又变成没有填充0的结果了。

日期和时间类型

类型 大小(字节)
DATETIME 8
DATE 3
TIMESTAMP 4
YEAR 1
TIME 3

DATETIME和DATE

DATETIME占用8字节,是占用空间最多的一种日期类型。它既
显示了日期,同时也显示了时间。其可以表达的日期范围为
“1000-01-01 00:00:00”到“9999-12-31 23:59:59”

DATE占用3字节,只存储日期,可显示的日期范围为“1000-01-01”到“9999-12-31”

在Mysql5.5版本之前(含5.5),数据库的日期类型不能精确到微妙级别,任何的微妙数值都会被截断,例如:

CREATE TABLE t(a DATETIME);INSERT INTO t SELECT'2011-01-01 00:01:10.123456';> SELECT * FROM t;> 2011-01-01 00:01:10

然而从MySQL 5.6.4版本开始,MySQL增加了对秒的小数部分
(fractional second)的支持,具体语法为:

type_name(fsp)

其中,type_name的类型可以是TIME、DATETIME和TIMESTAMP。fsp表示支持秒的小数部分的精度,最大为6,表示微妙;默认为0,表示没有小数部分,对于时间函数CURTIME()SYSDATE()UTC_TIMESTAMP()也增加了对fsp的支持:

> SELECT CURTIME(4),SYSDATE(4),UTC_TIMESTAMP(4)
> CURTIME(4): 21:35:44.9932
> SYSDATE(4): 2019-04-02 21:35:44.9932
> UTC_TIMESTAMP(4): 2019-04-02 13:35:44.9932

TIMESTAMP

TIMESTAMP和DATETIME显示的结果是一样的,都是固定
YYYY-MM-DD HH:MM:SS的形式。不同的是,TIMESTAMP
占用4字节,显示的范围为“1970-01-01 00:00:00”UTC
到“2038-01-19 03:14:07”UTC。
其实际存储的内容为“1970-01-01 00:00:00”到当前时间的毫秒数

MySQL的timestamp类型是4个字节,最大值是2的31次方减1,也就是2147483647,转换成北京时间就是2038-01-19 11:14:07(时区+8)

在建表时,列为TIMESTAMP的日期类型可以设置一个默认值,而DATETIME不行。

在更新表时,可以设置TIMESTAMP类型的列自动更新时间为当前时间。
所以像update_time这种字段用TIMESTAMP是极好的

> CREATE TABLE t(a INT,b TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
> INSERT INTO t(a) VALUES(1);
> SELECT * FROM t;> a: 1
> b: 2019-04-02 23:36:58

YEAR和TIME

YEAR类型占用1字节,并且在定义时可以指定显示的宽度为
YEAR(4)或YEAR(2),例如:

> CREATE TABLE t(a YEAR(2));
> INSERT INTO t SELECT '1990';
> SELECT * FROM t;> a: 1990
>
> DESC t;
> Field    Type    Null
> a        YEAR(4) YES

我本机设置宽度为2会自动变为4。Mysql版本是5.6.24

TIME类型占用3字节,显示的范围为“-838:59:59”~“838:
59:59”。TIME类型不仅可以用来保存一天中的时间,也可以用来保存时间间
隔,同时这也解释了为什么TIME类型也可以存在负值。

日期和时间相关的函数

NOW/CURRENT_TIMESTAMP/SYSDATE

> SELECT NOW(),CURRENT_TIMESTAMP(),SYSDATE()
>
> NOW(): 2019-04-05 00:10:05
> CURRENT_TIMESTAMP(): 2019-04-05 00:10:05
> SYSDATE(): 2019-04-05 00:10:05

上面的例子来看,都是返回系统的当前时间

再看下面这个例子:

mysql> SELECT NOW(),CURRENT_TIMESTAMP(),SYSDATE(),SLEEP(2),NOW(),CURRENT_TIMESTAMP(),SYSDATE() \G;
*************************** 1. row ***************************NOW(): 2019-04-05 00:22:48
CURRENT_TIMESTAMP(): 2019-04-05 00:22:48SYSDATE(): 2019-04-05 00:22:48SLEEP(2): 0NOW(): 2019-04-05 00:22:48
CURRENT_TIMESTAMP(): 2019-04-05 00:22:48SYSDATE(): 2019-04-05 00:22:50
1 row in set (2.00 sec)

在上面这个例子中人为地加入了SLEEP函数,让其等待2秒,这
时可以发现SYSDATE返回的时间和NOW及CURRENT_TIMESTAMP
是不同的,SYSDATE函数慢了2秒。究其原因是这3个函数有略微区
别:
CURRENT_TIMESTAMP是NOW的同义词,也就是说两者是相
同的。
SYSDATE函数返回的是执行到当前函数时的时间,而NOW返回
的是执行SQL语句时的时间

时间加减函数

mysql> SELECT NOW(), NOW() + 0\G
*************************** 1. row ***************************NOW(): 2019-04-05 00:28:31
NOW() + 0: 20190405002831
1 row in set (0.00 sec)

直接+0似乎变成了类似字符串的结果

这里需要使用特定的函数:DATE_ADD(date,INTERVAL expr unit)DATE_SUB(date,INTERVAL expr unit)

mysql> SELECT NOW() as now,DATE_ADD(now(),INTERVAL 1 DAY) as tomorrow,-> DATE_SUB(now(),INTERVAL 1 DAY) AS yesterday\G;
*************************** 1. row ***************************now: 2019-04-05 11:58:04tomorrow: 2019-04-06 11:58:04
yesterday: 2019-04-04 11:58:04
1 row in set (0.01 sec)

其中expr还可以是负值,unit可以是:MICROSECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、YEAR

DATE_FORMAT函数

mysql> SELECT DATE_FORMAT(NOW(),'%Y%m%d') as datetime;
+----------+
| datetime |
+----------+
| 20190405 |
+----------+
1 row in set (0.00 sec)

上面的是按照格式打印出日期,很简单,但是如果错误的使用这个函数,会导致查询特别慢,比如:

SELECT * FROM table WHERE DATE_FORMAT(date,'%Y%m%d')='xxxx-xxxx';

因为上述语句,不会使用索引,不能通过索引来查询数据,执行效率可能非常低。

数字类型

整型

MySQL支持INT、SMALLINT、TINYINT、MEDIUMINT和BIGIN。

类型 占用空间(字节) 最小值(Signed/Unsigened) 最大值(Signed/Unsigened)
TINYINT 1 -128
0
127
255
SMALLINT 2 -32768
0
32767
65535
MEDIUMINT 3 -8388608
0
8338607
16777215
INT 4 -2147483648
0
2147483647
4294967295
BIGINT 8 -9223372036854775808
0
9223372036854775807
18446744073709551615

浮点型

MySQL数据库支持两种浮点类型:单精度的FLOAT类型及双精
度的DOUBLE PRECISION类型。这两种类型都是非精确的类型,经
过一些操作后并不能保证运算的正确性,例如M*G/G不一定等于M。

MySQL允许使用非标准语法:FLOAT(M, D)或REAL(M,
D)或DOUBLE PRECISION(M, D)。这里,(M, D)表示该值一
共显示M位整数,其中D位是小数点后面的位数。例如,定义为
FLOAT(7,4)的一个列可以显示为-999.9999。MySQL在保存值时
会进行四舍五入,因此在FLOAT(7,4)列内插入999.00009的近似
结果是999.0001。

高精度类型

DECIMAL和NUMERIC类型在MySQL中被视为相同的类型,用
于保存必须为确切精度的值。
例如:salary DECIMAL(5,2)

其中5是精度,2是标度。精度表示保存值的主要位
数,标度表示小数点后面可以保存的位数。

mysql> desc t;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| a      | year(4)      | YES  |     | NULL    |       |
| salary | decimal(5,2) | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

精度和标度不能随意设,因为不能存入过大的值,比如存入99999.99,最终会变成999.99:

mysql> insert into t(salary) values(99999.99);
Query OK, 1 row affected, 1 warning (0.01 sec)mysql> select *  from t;
+------+--------+
| a    | salary |
+------+--------+
| NULL | 999.99 |
+------+--------+
1 rows in set (0.00 sec)

DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或
NUMERIC列的实际范围受具体列的精度或标度约束。

位类型

位类型,即BIT数据类型可用来保存位字段的值。BIT(M)类
型表示允许存储M位数值,M范围为1到64,占用的空间为(M+7)/8
字节。如果为BIT(M)列分配的值的长度小于M位,在值的左边用0
填充。例如,为BIT(6)列分配一个值b’101’,其效果与分配
b’000101’相同。要指定位值,可以使用b’value’符,例如:

mysql> create table t(a BIT(4));
Query OK, 0 rows affected (0.02 sec)mysql> insert into t select b'1000';
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

但是直接用SELECT进行查看会:

mysql> select * from t;
+------+
| a    |
+------+
|    |
+------+
1 row in set (0.00 sec)

如果要查看值需要进行转换:

mysql> select hex(a) from t;
+--------+
| hex(a) |
+--------+
| 8      |
+--------+
1 row in set (0.00 sec)

字符类型

Mysql默认的字符集是latin1,可以通过修改配置文件的方式修改它。推荐使用utf8mb4字符集。

排序规则

排序规则(Collation)是指对指定字符集下不同字符的比较规
则。其特征有以下几点:

  • 两个不同的字符集不能有相同的排序规则。
  • 每个字符集有一个默认的排序规则。
  • 有一些常用的命名规则。如_ci结尾表示大小写不敏感(case insensitive),_cs表示大小写敏感(case sensitive),_bin表示二进制的比较(binary)。
mysql> create table t(a varchar(10)) charset=utf8;
Query OK, 0 rows affected (0.02 sec)mysql> insert into t select 'a';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> insert into t select 'A';
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

然后执行这样的SQL查询:

mysql> select*from t where a='a';
+------+
| a    |
+------+
| a    |
| A    |
+------+
2 rows in set (0.00 sec)

执行SQL查询语句的目的可能只是要寻找小写字符“a”,但是现
在返回的却是两条记录,大写字符“A”也在返回结果集中。导致这个
问题的原因是utf8字符集默认的排序规则是utf8_general_ci。之前介绍
过_ci结尾表示大小写不敏感,因此这个示例中的“a”和“A”被视为一
致的字符而返回。

对于创建的表t如果需要对a列区分大小字符,则可以将a列的排序规则修改为
utf8_bin:

mysql> ALTER TABLE t-> MODIFY COLUMN a VARCHAR(10) COLLATE UTF8_BIN;
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from t where a='a';
+------+
| a    |
+------+
| a    |
+------+
1 row in set (0.00 sec)

排序规则不仅影响大小写的比较问题,也影响着索引。将t表修改未之前的定义,在创建一个唯一索引:

mysql> ALTER TABLE t MODIFY COLUMN-> a VARCHAR(10) COLLATE UTF8_GENERAL_CI;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> ALTER TABLE t ADD UNIQUE KEY(a);
ERROR 1062 (23000): Duplicate entry 'a' for key 'a'

提示有重复数据,添加唯一索引失败。因为排序规则是大小写不敏感,因此对于’A’和’a’认为是重复的。

CHAR和VARCHAR

CHAR(N)用来保存固定长度的字符串,VARCHAR(N)用来保
存变长字符类型。对于CHAR类型,N的范围为0~255,对于
VARCHAR类型,N的范围为0~65 535。CHAR(N)和
VARCHAR(N)中的N都代表字符长度,而非字节长度。

对于CHAR类型的字符串,MySQL数据库会自动对存储列的右边
进行填充(Right Padded)操作,直到字符串达到指定的长度N。而
在读取该列时,MySQL数据库会自动将填充的字符删除。有一种情
况例外,那就是显式地将SQL_MODE设置为
PAD_CHAR_TO_FULL_LENGTH

LENGTH函数返回的是字节长度,而不是字符长度。对于多字
节字符集,CHAR(N)长度的列最多可占用的字节数为该字符集单
字符最大占用字节数*N。

通过对多字节字符串使用CHAR_LENGTH函数和
LENGTH函数,可以发现两者的不同,示例如下:

mysql> SELECT@a:='Mysql技术内幕';
+---------------------+
| @a:='Mysql技术内幕' |
+---------------------+
| Mysql技术内幕       |
+---------------------+
1 row in set (0.00 sec)mysql> SELECT@a,HEX(@a),LENGTH(@a),CHAR_LENGTH(@a)\G;
*************************** 1. row ***************************@a: Mysql技术内幕HEX(@a): 4D7973716CBCBCCAF5C4DAC4BBLENGTH(@a): 13
CHAR_LENGTH(@a): 9
1 row in set (0.00 sec)

变量@a是gbk字符集的字符串类型,其中一个中文占两个字节。

VARCHAR类型存储变长字段的字符类型,与CHAR类型不同的
是,其存储时需要在前面增加一个表示长度的字符,该字符占用
1~2字节的空间。当存储的字符串长度小于255字节时,其需要1字节
的空间,当大于255字节时,需要2字节的空间。

所以,对于单字节的latin1来说,CHAR(10)和VARCHAR(10)最大占用的存储空间是
不同的,CHAR(10)占用10个字节,而VARCHAR(10)的最大占
用空间数是11字节,因为其需要1字节来存放字符长度。

BINARY和VARBINARY

INARY和VARBINARY存储的是二进制的字符
串,而非字符型字符串。BINARY和VARBINARY没有字
符集的概念,对其排序和比较都是按照二进制值进行对比。

BINARY(N)和VARBINARY(N)中的N指的是字节长度。

mysql> CREATE TABLE t (-> a BINARY(1)) ENGINE=InnoDB CHARSET=GBK;
Query OK, 0 rows affected (0.02 sec)mysql> SET NAMES GBK;
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t SELECT '我';
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 1mysql> SHOW WARNINGS\G;
*************************** 1. row ***************************Level: WarningCode: 1265
Message: Data truncated for column 'a' at row 1
1 row in set (0.00 sec)

truncated : 截断了的

表t包含一个类型为BINARY(1)的列,因为BINARY(N)中N
代表字节,而gbk字符集中的中文字符“我”需要占用2字节,所以在插
入时给出警告,提示字符被截断。

mysql> select * from t;
+------+
| a    |
+------+
| Î    |
+------+
1 row in set (0.00 sec)

BLOB和TEXT

BLOB(Binary Large Object)是用来存储二进制大数据类型的。
根据存储长度的不同BLOB可细分为以下4种类型,括号中的数代表
存储的字节数:

TINYBLOB(2^8)
BLOB(2^16)
MEDIUMBLOB(2^24)
LONGBLOB(2^32)

其中2^8表示2的8次方。

TEXT类型同BLOB一样,细分为以下4种类型:

TINYTEXT(2^8)
TEXT(2^16)
MEDIUMTEXT(2^24)
LONGTEXT(2^32)

在大多数情况下,可以将BLOB类型的列视为足够大的
VARBINARY类型的列。同样,也可以将TEXT类型的列视为足够大
的VARCHAR类型的列。

但BLOB和TEXT在以下几个方面又不
同于VARBINARY和VARCHAR:

  • 在BLOB和TEXT类型的列上创建索引时,必须制定索引前缀的长度。而VARCHAR和VARBINARY的前缀长度是可选的。
  • BLOB和TEXT类型的列不能有默认值。
  • 在排序时只使用列的前max_sort_length个字节。

max_sort_length默认值为1024,该参数是动态参数,任何客户端
都可以在MySQL数据库运行时更改该参数的值。

ENUM和SET类型

ENUM和SET类型都是集合类型,不同的是ENUM类型最多可枚
举65 536个元素,而SET类型最多枚举64个元素。

由于MySQL不支持传统的CHECK约束,因此通过ENUM和SET
类型并结合SQL_MODE可以解决一部分问题。
比如,表中有一个“性别”列,规定域的范围只能是male和female,在这种情况下可以通过
ENUM类型结合严格的SQL_MODE模式进行约束,过程如下:

mysql> CREATE TABLE t(-> user VARCHAR(30),-> sex ENUM('male','female'))ENGINE=InnoDB;
Query OK, 0 rows affected (0.03 sec)mysql> SET SQL_MODE='strict_trans_tables';
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t SELECT 'David','male';
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> INSERT INTO t SELECT 'Rose','female';
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> INSERT INTO t SELECT 'Jack','bimale';
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

可以看到,前两次的操作正确地插入了“male”和“female”值,而
对于未定义的“bimale”,MySQL数据库在严格的SQL_MODE下抛出
了报错警告,起到了一定的约束作用。

mysql> select * from t;
+-------+--------+
| user  | sex    |
+-------+--------+
| David | male   |
| Rose  | female |
| Jack  |        |
+-------+--------+
3 rows in set (0.00 sec)

《MySQL技术内幕(SQL编程)》——数据类型相关推荐

  1. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

  2. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 ​ 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...

  3. 读书笔记之MySQL技术内幕

    前言 本文内容基本摘抄自<MySQL技术内幕 InnoDB存储引擎>,以供复习之用,没有多少参考价值.想要更详细了解请参考原书. 第一章.MySQL体系结构和存储引擎 数据库是物理操作系统 ...

  4. mysql技术内幕sampdb_MySQL技术内幕汇总

    MySql技术内幕之MySQL入门(1) 检查系统中是否已经安装了MySQL sudo netstat -tap | grep mysql 若没有显示已安装结果,则没有安装.否则表示已经安装. sud ...

  5. mysql技术内幕sampdb_MySql技术内幕之MySQL入门(1)

    MySql技术内幕之MySQL入门(1) 安装 检查系统中是否已经安装了MySQL sudo netstat -tap | grep mysql 若没有显示已安装结果,则没有安装.否则表示已经安装. ...

  6. Mysql技术内幕InnoDB存储引擎——InnoDB存储引擎

    特此申明: 前段时间找工作所以看了<Mysql技术内幕InnoDB存储引擎>,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处.不过无所谓啦,写出来自己看看,需要的 ...

  7. MySQL技术内幕 InnoDB存储引擎:锁问题(脏读、不可重复读)

    1.脏读 在理解脏读(Dirty Read)之前,需要理解脏数据的概念.但是脏数据和之前所介绍的脏页完全是两种不同的概念.脏页指的是在缓冲池中已经被修改的页,但是还没有刷新到磁盘中,即数据库实例内存中 ...

  8. MySQL必知必会教程:深入理解MySQL技术内幕

    2019独角兽企业重金招聘Python工程师标准>>> MySQL必知必会教程:深入理解MySQL技术内幕 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知了.当前 ...

  9. 【MySQL技术内幕】49-事务的实现之group commit

    若事务为非只读事务,则每次事务提交时需要进行一次 fsync操作,以此保证重做日志都已经写入磁盘.当数据库发生宕机时,可以通过重做日志进行恢复.虽然固态硬盘的出现提高了磁盘的性能,然而磁盘的fsync ...

  10. 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

    文章目录 1 一条SQL查询语句是如何执行的 2 mysql体系结构 3 InnoDB存储引擎 4 总结 1 一条SQL查询语句是如何执行的 ​ 通常我们使用数据库,都是将数据库看成一个整体,我们的应 ...

最新文章

  1. Python爬虫【二】请求库requests
  2. 2018批量打印开关_新品上市,震撼来袭!买UV平板打印机,一定看过这款后再定!...
  3. js 中的break continue return
  4. web浏览器_vs2019使用webview2开发web浏览器 - 左正
  5. ec6110刷linux系统,华为EC6110-T优盘强刷固件升级包及刷机教程
  6. oracle 中DATETIME与TIMESTAMP区别
  7. SQL Server数据库--过滤数据
  8. erc20怎么查询代币交易记录_信用卡在pos机上刷卡手续费怎么算?信用卡刷卡记录如何查询?...
  9. Qt C/C++统计运行时间
  10. Go语言中Path包用法
  11. 数据结构算法——1006. 线性链表的插入与删除
  12. 技术分享 | show engine innodb status中Pages flushed up to 的含义
  13. 电影《绝望主夫》观后感
  14. Spring基本使用
  15. 关于Google Pay JAVA后端处理
  16. 算法导论-3.递归部分习题选
  17. 负荷需求响应模型matlab 通过分时电价方式下的负荷需求响应模型得到负荷响应前后变化情况,可以看到明显呈现削峰填谷的作用
  18. 本地图片转换成网络链接图片
  19. 欧拉线性筛法求素数(顺便实现欧拉函数的求值)
  20. 软件收集-结构计算与分析软件

热门文章

  1. Asp.Net MVC控制器、控制器动作和动作结果
  2. java day25【Junit单元测试 、反射 、 注解】
  3. 【Unity Shader】---UnityShader 提供的CG/HLSL语义
  4. bzoj2705: [SDOI2012]Longge的问题
  5. [leedcode 169] Majority Element
  6. 使用 Capistrano 和写作 Ruby 迭代边缘部署
  7. Android Bitmap 开源图片框架分析(精华四)
  8. .ashx文件与.ashx.cs
  9. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-3. 菜单)...
  10. ASP.NET程序如何防止被注入(整站通用)