08-初识SQL语句
数据库客户端操作的内容(增查改删):
1.操作数据库
操作数据库
增(本质上就是创建一个本地文件夹)
create database db1 charset utf8;
查看单个数据库的内容
show create database db1 ;
查看所有的数据库
show databases;
改(没有改数据库名字的方式)
alter database db1 charset utf8;
drop database db1;
2.操作库里的表
操作文件(表)
切换数据库
use db1;
查看当前所在的数据库名称
select database();
增(创建一个新的表)
mysql创建一张表就是在硬盘上创建文件, 一张表对应的可能不止一个文件, 是多个文件组合成了一张表, frm就是表结构, ibd就是表内的数据
create table t1(id int,name char);
查看单表
show create table t1;
友好的查看方式
desc t1;
查看所有的表
show tables;
将名字的字符长度改为6个
alter table t1 modify name char(6);
修改表的表头内容(将name->Name)
alter table t1 change name Name char(7);
drop table t1;
3.操作表里的内容(记录)
操作文件内容(记录)
values 可以插入一条记录也可以用逗号隔开同时插入多条记录(默认顺序就是字段顺序)
insert t1(id,name) values(1,'panda'),(2,'boy'),(3,'zombie');
查表是在本数据库内查,如果不在数据库内就要加指定数据库
select id,name from db1.t1;
查询所有的字段(不推荐使用星号)
select * from t1;
改(需要指定改哪一个字段)
update db1.t1 set name='SB';
update db1.t1 set name='panda' where id = 2;
删除全表
delete from t1;
删除表中某个记录
delete from t1 where id = 1;

09-库操作
SQL语言主要分为3种
DDL语句 数据库定义语言:数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

一 系统数据库

nformation_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
mysql: 授权库,主要存储系统用户的权限信息
test: MySQL数据库系统自动创建的测试数据库

二 创建数据库

1 语法(help create database)
CREATE DATABASE 数据库名 charset utf8;
2 数据库命名规则:
可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
最长128位

三 数据库相关操作

查看数据库
show databases;
show create database db1;
select database();
选择数据库
USE 数据库名
删除数据库
DROP DATABASE 数据库名;
修改数据库
alter database db1 charset utf8;

10-存储引擎介绍

一 什么是存储引擎

mysql每建立一个库就是一个文件夹,每建立一张表就是一个文件,如果自己建立一张表,应该根据数据类型的不同存储在不同的表中,存储引擎就是表的类型
SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询
查看mysql支持的存储引擎
show engines;
MySQL支持多种数据类型的数据引擎,像其他的数据库(oracle,sqlserver)只支持一种
InnoDB 存储引擎
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
 
查看mysql支持的存储引擎
show engines;
指定表类型(存储引擎)
真实数据存储在硬盘里
CREATE TABLE t1(id int)engine = innodb;
真实数据存储在内存里,内存清空就没了
CREATE TABLE t2(id int)engine = memory;
真实数据一旦插入就放入黑洞
CREATE TABLE t3(id int)engine = blackhole;
CREATE TABLE t4(id int)engine = myisam;
尝试传入值
INSERT t1 VALUES (1);
INSERT t2 VALUES (1);
INSERT t3 VALUES (1);
INSERT t4 VALUES (1);

11-表的增删改查
一张表应该有自己的标题(字段),对于一张表来说,字段是必须要有的,而且字段必须要有自己的数据类型
插入记录要严格按照字段的顺序来插入,并且遵循该字段的数据类型
创建表的语法
注意:创建表的时候,字段与字段之间要加逗号分隔,但是最后一个字段就不要再加逗号了,不然就会报语法错误
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
 
#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
show create table t1\G; #查看表详细结构,可加\G(一行一行显示)
修改表结构
语法:
1. 修改表名
ALTER TABLE 表名
RENAME 新表名;
 
2. 增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
 
3. 删除字段
ALTER TABLE 表名
DROP 字段名;
 
4. 修改字段
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
练习
示例:
1. 修改存储引擎
mysql> alter table service
-> engine=innodb;
 
2. 添加字段
mysql> alter table student10
-> add name varchar(20) not null,
-> add age int(3) not null default 22;
 
mysql> alter table student10
-> add stu_num varchar(10) not null after name; //添加name字段之后
 
mysql> alter table student10
-> add sex enum('male','female') default 'male' first; //添加到最前面
 
3. 删除字段
mysql> alter table student10
-> drop sex;
 
mysql> alter table service
-> drop mac;
 
4. 修改字段类型modify
mysql> alter table student10
-> modify age int(3);
mysql> alter table student10
-> modify id int(11) not null primary key auto_increment; //修改为主键
 
5. 增加约束(针对已有的主键增加auto_increment)
mysql> alter table student10 modify id int(11) not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined
 
mysql> alter table student10 modify id int(11) not null auto_increment;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
 
6. 对已经存在的表增加复合主键
mysql> alter table service2
-> add primary key(host_ip,port);
 
7. 增加主键
mysql> alter table student1
-> modify name varchar(10) not null primary key;
 
8. 增加主键和自动增长
mysql> alter table student1
-> modify id int not null primary key auto_increment;
 
9. 删除主键
a. 删除自增约束
mysql> alter table student10 modify id int(11) not null;
 
b. 删除主键
mysql> alter table student10
-> drop primary key;

五、复制表

复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;
 
只复制表结构
mysql> select * from service where 1=2; //条件为假,查不到任何记录
Empty set (0.00 sec)
mysql> create table new1_service select * from service where 1=2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
 
mysql> create table t4 like employees;

六、删除表

DROP TABLE 表名;

12-整数类型
  • 整型
         整型通常用来表示人的年龄,等级,id号,身份证号等等
         不同的整型类型用来表示不同的范围,存储的字节不同,占用的空间不同
         如果有人在mysql的整型里面加了整型的宽度,其实整型的宽度是不受约束的,所以不要去对整型加宽度限制,加上的宽度限制表示的是显示宽度。
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
  • 浮点型
作用:存储薪资、身高、体重等参数
DECIMAL的底层原理实际上是字符串的形式保存的,所以数据精度非常高,缺点是整数的范围小
float和double的精度虽然不够高,但是整数表示的范围足够
类型 大小 范围(有符号) 范围(无符号) 用途
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38)
单精度
浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
 

13-日期类型
datetime与timestamp的区别
在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。
下面就来总结一下两种日期类型的区别。
1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,
操作系统以及客户端连接都有时区的设置。
3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),
如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
CREATE TABLE student(
id int ,
name char(6),
born_year YEAR ,
birth_date date,
class_time TIME ,
reg_time datetime
);
insert into student VALUES
(1,'panda',now(),now(),now(),now());

14-字符类型
字符类型就是描述性数据的存储数据类型
  • char
char:定长类型
  • varchar
varchar:变长类型
字符类型的宽度指的是字符的个数
存储数据是一种机制,取数据的时候对于char和varchar在取的时候只会按照值取,不会管具体有几个空格的,末尾的空格在查询时并没有实际的意义
MySQL在实际查询的过程中,做比较的时候是忽略末尾的空格的,前部分或者中间部分的空格是不去的
但是用like去查询的时候,空格是不去的,这个时候的char就是要写具体的字符规定的长度
CREATE TABLE t13(name char(5));
CREATE TABLE t14(name VARCHAR (5));
insert into t13(name) VALUES ('panda'),('gg');
insert into t14(name) VALUES ('pand'),('g');
SELECT CHAR_LENGTH (name) from t13;
SELECT CHAR_LENGTH (name) from t14;
设置取值时不需要取消空格
SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
char类型和varchar类型的存储原理
1.char类型如果存储的一个值是空值,char就存4个bytes;varchar类型对于空值就存1个byte表示这个数据的长度
2.假设传入的数值的长度正好是传入的宽度的限制,那么这个时候char类型是节省空间的
3.假设传入的数值的长度比传入的宽度的限制小的时候,那么这个时候varchar类型是节省空间的
4.一般来说,varchar类型的一个bytes不是固定只有一个byte,如果你的数据已经超过了255个字节,那么varchar就会使用2个bytes(可以用来表示65535)来传入数据头,mysql对单个的字符长度是不能超过65535的
5.mysql里不应该把视频或者大图片放入,因为mysql内部应该保证数据越精简越好,如果真要存储大文件,不应该把大的文件存为字符类型,只需要存储一个地址路径就行了
【总结】
char类型
优点:简单粗暴,不管多少数据,按照固定格式存储,存储和提取数据都快
缺点:浪费存储的空间
varchar类型:
优点:更加节省空间,存储数据更精准
缺点:存储和提取数据慢,因为要先读取数据的头,判断有多少个字节以后再提取数据
大部分情况下都可以使用char类型,目前的技术水平对于硬件的存储容量已经足够了,所以大部分情况下使用char类型的存储方式就足够满足需求了,或者对于存储完成后无关的数据,或者长时间都不用于查找的数据,使用varchar类型更合适
对于建表的过程中,应该尽量的把定长的数据往表的结构前放,把变长的数据往后放,而且一张表中不要同时使用char和varchar类型的混合使用
其他的字符类型无非是支持的字符的宽度更宽而已,但是尽量不要去使用,因为在数据库中尽量使用精简的数据去保存数据。

15-枚举类型与集合类型
字段的值只能在给定的范围中选择,比如单选框或者多选框
enum单选,只能在给定的范围内选一个值,如性别、名族等
set多选,在给定的范围里可以选择一个或一个以上的值(爱好1、爱好2、爱好3等)

16-约束条件not null与default
什么是约束条件?
用于保证数据的完整性和一致性
CREATE TABLE t15(
id int(11) unsigned zerofill
);
CREATE TABLE t16(
id int,
name char(6),
sex enum('male','female') not null default 'male'
);

17-约束条件unique key
限制字段传入的值是唯一的,不重复的
单列唯一
方式一
CREATE TABLE department(
id int,
name char(10) UNIQUE
);
方式二
CREATE TABLE department(
id int,
name char(10),
UNIQUE (id),
UNIQUE (name)
);
insert into department VALUES
(1,'IT'),
(2,'IIT');
####################################################3
联合唯一
几个字段组合在一起,只要不重复就可以,单独的字段重复没有关系
CREATE TABLE services(
id int,
ip char(15),
port int,
UNIQUE (id),
UNIQUE (ip,port)
);
insert into services VALUES
(1,'127.0.0.1',8080),
(2,'127.0.0.1',8081),
(3,'127.0.0.1',8082);

18-约束条件primary key
从约束的角度来说,就是不为空且唯一
默认的存储引擎Innodb,对于Innodb的引擎来说,一张表内必须有一个主键,如果不指定主键是可以的
主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,一张表中必须有且只有一个主键。
如果没有明确的指定primary key的话,会指定一个不为空且唯一的字段作为主键
#单列主键(通常是id字段设置为主键)
CREATE TABLE t17(
id int PRIMARY KEY ,
name char(16)
);
insert into t17 VALUES
(1,'panda'),
(2,'boy');
CREATE TABLE t18(
id int not null UNIQUE ,
name char(16)
);
#复合主键
CREATE TABLE t19(
ip char(15),
port int,
PRIMARY KEY (ip,port)
);
insert into t19 VALUES
('127.0.0.1',8080),
('127.0.0.1',8081);

19-约束条件auto_increment
auto_increment->自增长
清空表(如果表内是有自增长的约束的时候,即使删除了表的内容,但是表的自增记录也没有设置为1)
清空表不要用delete,清空表要使用truncate t20;
delete使用在和条件查询的时候的where语句上
CREATE TABLE t20(
id int PRIMARY KEY auto_increment,
name char(16)
);
insert into t20(name) VALUES
('panda'),
('boy');
 
insert INTO t20(name) VALUES
('panda'),
('1111');
#清空表(如果表内是有自增长的约束的时候,即使删除了表的内容,但是表的自增记录也没有设置为1)
清空表不要用delete,清空表要使用truncate t20;
delete使用在和条件查询的时候的where语句上
 
#了解
#查看mysql自己的变量(%代表任意的字符)
show variables like 'auto_inc%';
#步长
auto_increment_increment
#起始位置(偏移量)
auto_increment_offset
#自定义
#自定义步长
#本次连接有效
set SESSION auto_increment_increment = 5;
#全局有效(所有的会话要全部再加载一次才能设置成功)
set GLOBAL auto_increment_increment = 5;
#自定义偏移量(起始偏移量一定是要小于步长的,第一次的偏移量要小于等于设置的步长)
set GLOBAL auto_increment_offset = 5;

20-约束条件之foreign key
[非常重要]外键
建立表之间的关系
写一个项目是不可能把所有的数据全部存放在一张表里的,容易出现数据重复,浪费存储空间,如果修改数据也是十分麻烦的,可扩展性极差
外键就是把表和表之间建立硬性的关系
写项目的时候,最好不要把表直接建立硬性关联关系
不要真正的把表之间耦合到一起
如果数据库要修改,所有的项目很有可能都会变动
ON DELETE CASCADE ->删除同步
ON UPDATE CASCADE->更新同步
外键 foregin key
先建被关联的表(保证被关联的字段唯一)
CREATE TABLE dep(
id int PRIMARY KEY ,
name char(16),
comment char(50)
);
 
CREATE TABLE emp(
id int PRIMARY KEY ,
name char(10),
sex enum('male','female') not null DEFAULT 'male',
dep_id int,
FOREIGN KEY (dep_id) REFERENCES dep(id)
);
insert into dep(id,name,comment) VALUES
(1,'IT部门','唯一的一个技术部门'),
(2,'销售部门','唯一的一个会说话的部门'),
(3,'财务部门','唯一的一个会花钱的部门');
insert into emp(id,name,sex,dep_id) VALUES
(1,'panda','male',1),
(2,'boy','female',3),
(3,'zombie','male',2);
外键 foregin key
先建被关联的表(保证被关联的字段唯一)
CREATE TABLE dep(
id int PRIMARY KEY ,
name char(16),
comment char(50)
);
 
CREATE TABLE emp(
id int PRIMARY KEY ,
name char(10),
sex enum('male','female') not null DEFAULT 'male',
dep_id int,
FOREIGN KEY (dep_id) REFERENCES dep(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
insert into dep(id,name,comment) VALUES
(1,'IT部门','唯一的一个技术部门'),
(2,'销售部门','唯一的一个会说话的部门'),
(3,'财务部门','唯一的一个会花钱的部门');
insert into emp(id,name,sex,dep_id) VALUES
(1,'panda','male',1),
(2,'boy','female',3),
(3,'zombie','male',2);
#删除外键关联的表数据
delete from emp where dep_id = 1;
delete from dep where id = 1;

21-表关系之多对一
表之间建立关系都是两两之间建立
找表的关系要站在两个表的角度分别考虑
多条记录对应一条记录
#1、先站在左表的角度去找
是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)
#2、再站在右表的角度去找
是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)
#3、总结:
#多对一:
如果只有步骤1成立,则是左表多对一右表
如果只有步骤2成立,则是右表多对一左表
create table t2(
id int primary key ,
name char(15)
);
insert into t2 values
(1,'乱七八糟出版社'),
(2,'随便什么出版社'),
(3,'emmm出版社');
 
create table t3(
id int primary key ,
name char(10),
p_id int,
foreign key (p_id) references t2(id)
on update cascade
on delete cascade
 
 
);
insert into t3 values
(1,'独孤九剑',2),
(2,'神明绝学',1),
(3,'少林铁头功',2),
(4,'南山拳',3);
 

22-表关系之多对多
作者和书的关系就是典型的多对多关系
双向的多对一关系就是多对多关系
多对多的关系表建立需要第三张表去存储两张表之间的关系

23-表关系之一对一
假设有两张表,一张客户表,一张学生表,这就是一对一关系

 
 

路飞学城Python-Day35的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  9. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

  10. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

随机推荐

  1. 【JavaScript框架封装】实现一个类似于JQuery的事件框架的封装

    // 事件框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 实现一个浏览器的基本 ...

  2. 使用canvas保存网页为pdf文件支持跨域

    前言 之前上一篇随笔说了Canvas截图网页为图片,下来个新需求,把网页截图后保存为PDF文件供用户下载. 前文 Canvas截图网页为图片:https://www.cnblogs.com/bubub ...

  3. P1828 香甜的黄油 Sweet Butter (spfa)

    题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费 ...

  4. 汇编-理解call,ret

    ; 有意思的东西,主函数调用子函数用汇编来理解 assume cs:codeseg codeseg segment start: main: call sub1 ; 调用子函数1, push IP1 ...

  5. mplayer 在线播放错误

    CPU: ARM Playing rtsp://admin:12345@192.168.1.198/mpeg4/main/ch01/av_stream.Connecting to server 192 ...

  6. js 只能输入英文和数字,且首位必须是字母,字母总数不能超过3个,总长度不能超过20!

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. 对thinkpad太失望了

    本来本着对thinkpad的信任买的,结果买回来一直吱吱吱吱响个不停. 好像是磁盘的问题,太垃圾了. http://benyouhui.it168.com/thread-1111376-1-1.htm ...

  8. ios网络学习------3 用非代理方法实现异步post请求

    #pragma mark - 这是私有方法.尽量不要再方法中直接使用属性,由于一般来说属性都是和界面关联的,我们能够通过參数的方式来使用属性 #pragma mark post登录方法 -(void) ...

  9. 造个简单的轮子倒是不难,但可用性健壮性高到qt这样全世界都在用,就几乎不可能了

    造个简单的轮子倒是不难,但可用性健壮性高到qt这样全世界都在用,就几乎不可能了比如自己写个事件循环实现信号槽,还真不难,我这边的架构里就这么搞了个仿osgi的事件总线嵌入式实时操作系统上能用的大型gu ...

  10. dnscapy使用——本质上是建立ssh的代理(通过dns tunnel)

    git clone https://github.com/cr0hn/dnscapy.git easy_install Scapy 服务端: python dnscapy_server.py a.fr ...