数据库
沙发类型及区别?
一、沙发类型及区别?
沙发分为,
布艺沙发,
木制沙发,
皮面沙发,
懒人沙发,
按摩沙发,
二、街舞类型分类及区别?
街舞有6种类别:
1、locking(锁舞)
最早的街舞舞种,起源于20世纪六十年代。身体做一些很快的动作,然后在某一个动作时候突然停住 ,顾名思义lock,锁住的意思,身体突然被锁住了一样。
2、Popping(机械舞)
起源于70年代初成型于70年代中后期,最初的基本形式是借由各部位肌肉迅速地收缩与放松的技巧,是舞者的身体产生震动的感觉。运用身体各部位的肌肉和关节,随着音乐的节拍,由肌肉迅速地收缩与放松的技巧(pop),配合wave的舞步。
3、Breaking(霹雳舞)
1970年代起源于美国纽约市的布朗克斯区,是一种难度较高的街舞舞种,比较重视舞步和技巧的结合,主要由TopRock、UpRock、Footwork、Powermoves、Freeze等几类不同的舞蹈方式所组成。
4、Hip-Hop(嘻哈舞)
起源于80年代末90年代初,是继Breaking之后的第二种Hiphop舞蹈。有着幅度大而简单的舞步,能够表现出复杂的舞感。嘻哈舞最开始的原本意指B-Boy,后来才有人用MC唱的歌来跳舞,所以说跳Hip-Hop其实是一种后来的说法,B-Boy才是Hip-Hop的起源。
5、Turfing
出现于美国西岸,以手臂在肩膀等关节处进行非人类的扭曲(Bonebreak)为主要特点,大量结合Popping和相关的Robot、Wave、Kingtut、Slide、Slowmotion等Style和技术,以及芭蕾、Breaking等舞蹈的身体旋转和翻转,形成的一种诡异夸张的新兴街舞舞种。
6、JAZZ(爵士舞)
爵士舞是一种急促又富动感的节奏型舞蹈,是属于一种外放性的舞蹈,不像古典芭蕾舞或现代舞所表现的一种内敛性的舞蹈。Contemporary Jazz作为街舞舞种之一, 随着时间迁移,亦在不同的Jazz编舞师口中被冠以Street Jazz、Jazz Funk、La Style、La Style Hiphop、Urban Dance等不同名称。
三、ic卡类型及区别?
IC卡是一种集成电路卡,通常用于存储和传输个人信息。根据嵌入集成电路芯片的形式和芯片类型的不同,IC卡大致可分为以下几种类型:非加密存储器卡:卡内的集成电路芯片主要是EEPROM,具有数据存储功能,不具有数据处理功能和硬件加密功能。这类卡信息存储方便,使用简单,价格便宜,很多场合都可替代此卡,但由于其本身不具备信息保密功能,因此只能应用在保密性要求不高的应用场合。逻辑加密存储器卡:在非加密存储器卡的基础上增加了加密逻辑电路,加密逻辑电路通过校验密码方式来保护卡内的数据对于外部访问是否开放,但只是低层次的安全保护,无法防范恶意性的攻击。CPU卡:也称智能卡,卡内的集成电路中带有微处理器CPU、存储单元[包括随机存储器RAM、程序存储器ROM(FLASH)、用户数据存储器(EEPROM)以及芯片操作系统COS]。装有COS的CPU卡相当于一台微型计算机,不仅具有数据存储功能,同时具有命令处理和数据安全保护等功能。由于CPU卡有存储容量大、处理能力强、信息存储安全等特性,因此,广泛应用在信息安全性要求特别高的场合。此外,按照数据读写方式,智能卡可分为接触式IC卡和非接触式IC卡;在卡上具有MPU和存储器并装有键盘、液晶显示器和电源,有的卡上还具有指纹识别装置等的超级智能卡。以上是IC卡的几种类型及其区别,每种类型的IC卡都有其特定的应用场景和优势。
四、俄语从句类型及区别?
俄语从句类型主要有以下几种:
1. 主从句:主从句是一种最简单的从句类型,通常由一个主句和一个或多个从句组成。从句通常用来补充、修饰或限制主句的意思。在俄语中,从句通常由从属连词或连接词引导,例如“Если”、“While”、“Because”等。
2. 定语从句:定语从句是用来修饰名词或代词的从句,通常由关系代词或关系副词引导。例如,“когда я был маленьким”(当我小的时候),这里的“when I was small”就是一个定语从句,用来修饰名词“little”。
3. 状语从句:状语从句是用来修饰动词、形容词或副词,表示时间、地点、原因、条件、目的、结果等概念。在俄语中,状语从句通常由从属连词或连接词引导,例如“Когда”、“ Если”、“ Будучи”等。
这些从句类型之间的主要区别在于它们所起的作用和引导词的不同。主从句通常用来表达完整的意义,从句用来补充、修饰或限制主句的意思;定语从句用来修饰名词或代词;状语从句用来修饰动词、形容词或副词,表示时间、地点、原因、条件、目的、结果等概念。在俄语中,从句通常由从属连词或连接词引导。
总的来说,俄语从句类型多样,各自具有不同的作用和使用场景。从句的使用可以使语言更加丰富、准确和复杂,可以帮助我们更好地表达思想和情感。
五、主板类型分类及区别?
主板如何分类
一、按主板上使用的CPU来看
386主板、486主板、奔腾(Pentium,即586)主板、高能奔腾(Pentium Pro,即686)主板。 同一级的CPU往往也还有进一步的划分,如奔腾主板,就有是否支持多能奔腾(P55C,MMX要求主板内建双电压), 是否支持Cyrix 6x86、 AMD 5k86 (都是奔腾级的CPU,要求主板有更好的散热性)等区别。
二、按主板上I/O总线的类型来看
ISA(Industry Standard Architecture)工业标准体系结构总线;EISA(Extension Industry Standard Architecture)扩展标准体系结构总线;MCA(Micro Channel)微通道总线。
此外,为了解决CPU与高速外设之间传输速度慢的瓶颈问题,出现了两种局部总线,它们是:VESA(Video Electronic Standards Association)视频电子标准协会局部总线,简称VL总线;PCI(Peripheral Component Interconnect)外围部件互连局部总线,简称PCI总线。
486级的主板多采用VL总线,而奔腾主板多采用PCI总线。 目前,继PCI之后又开发了更外围的接口总线,它们是:USB(Universal Serial Bus)通用串行总线。IEEE1394(美国电气及电子工程师协会1394标准)俗称火线(Fire Ware)。
三、按逻辑控制芯片组来看
这些芯片组中集成了对CPU、CACHE、I/0和总线的控制586以上的主板对芯片组的作用尤为重视。Intel公司出品的用于586主板的芯片组有:LX 早期的用于Pentium 60和66MHz CPU的芯片组。NX 海王星(Neptune),支持Pentium 75 MHz以上的CPU,在Intel 430 FX芯片组推出之前很流行,现在已不多见。
FX 在430和440两个系列中均有该芯片组,前者用于Pentium,后者用于Pentium Pro。HX Intel 430系列,用于可靠性要求较高的商用微机。VX Intel 430系列,在HX基础上针对普通的多媒体应用作了优化和精简。有被TX取代的趋势。TX Intel 430系列的最新芯片组,专门针对Pentium MMX技术进行了优化。
GX、KX Intel 450系列,用于Pentium Pro,GX为服务器设计,KX用于工作站和高性能桌面PC。MX Intel 430系列,专门用于笔记本电脑的奔腾级芯片组,参见《Intel 430 MX芯片组》。 非Intel公司的芯片组有:VT82C5xx系列 VIA公司出品的586芯片组。
四、按主板结构来看
AT 标准尺寸的主板,IBM PC/A机首先使用而得名,有的486、586主板也采用AT结构布局。Baby AT 袖珍尺寸的主板,比AT主板小,因而得名。很多原装机的一体化主板首先采用此主板结构。ATX 127;改进型的AT主板,对主板上元件布局作了优化,有更好的散热性和集成度,需要配合专门的ATX机箱使用。
一体化(All in one) 主板上集成了声音,显示等多种电路,一般不需再插卡就能工作,具有高集成度和节省空间的优点,但也 有维修不便和升级困难的缺点。在原装品牌机中采用较多。NLX Intel最新的主板结构,最大特点是主板、CPU的升级灵活方便有效,不再需要每推出一种CPU就必须更新主板设计,此外还有一些上述主板的变形结构,如华硕主板就大量采用了3/4 Baby AT尺寸的主板结构。
五、按功能来看
PnP功能带有PnP BIOS的主板配合PnP操作系统(如Win95)可帮助用户自动配置主机外设,做到即插即用节能(绿色)功能 一般在开机时有能源之星(Energy Star)标志,能在用户不使用主机时自动进入等待和休眠状态,在此期间降低CPU及各部件的功耗。
无跳线主板这是一种新型的主板,是对PnP主板的进一步改进。在这种主板上,连CPU的类型、工作电压等都无须用跳线开关,均 自动识别,只需用软件略作调整即可。经过Remark的CPU在这种主板上将无所遁形。
486以前的主板一般没有上述功能,586以上的主板均配有PnP和节能功能,部分原装品牌机中还可通过主板控制主机电源的通断,进一步做到智能开/关机,这在兼容机主板上还很少见,但肯定是将来的一个发展方向。无跳线主板将是主板发展的另一个方向。
六、ps类型分类及区别?
PS,全称为Photoshop,是一款由Adobe公司开发的图像处理软件。Photoshop有许多不同的版本,每个版本都有其特定的功能和特点。以下是PS的主要类型及其区别:Photoshop CS(8.0版本):这是Photoshop的经典版本,也是许多设计师和摄影师开始学习PS的版本。它具有基本的图像处理和调整功能,如裁剪、色彩调整、滤镜等。Photoshop CS6:相比于CS版本,CS6增加了新的画笔引擎、改进的裁剪工具和内容感知移动工具等功能。此外,它还支持更多的文件格式和3D功能。Photoshop CC(Creative Cloud):CC是Adobe推出的云服务,用户可以在线存储和共享文件。Photoshop CC也提供了更多的云服务功能,如同步设置、在线编辑和共享功能等。此外,CC还提供了更多智能化的工具,如面部识别和智能修复画笔等。Photoshop Lightroom:Lightroom是一款专门用于处理RAW格式照片的软件,提供了强大的照片编辑和管理功能。它具有类似于Photoshop的界面和工具,但更加专注于照片的管理和编辑。Photoshop Elements:相比于其他版本的Photoshop,Elements更加适合家庭用户和非专业设计师。它具有基本的图像处理和编辑功能,但更加简单易用。总的来说,Photoshop的不同版本具有不同的功能和特点,用户可以根据自己的需求选择适合自己的版本。无论是专业设计师还是普通用户,Photoshop都能提供强大的图像处理和编辑功能。
七、rc类型分类及区别?
在计算机科学中,RC(Reference Counting)是一种内存管理技术,用于自动跟踪和管理动态分配的内存。RC类型分类及其区别如下:
1. 强引用计数(Strong Reference Counting):强引用计数是最基本的RC类型,它通过维护一个引用计数器来跟踪对象的引用数量。当引用计数器为0时,对象被释放。强引用计数的优点是简单高效,但容易导致循环引用的问题。
2. 弱引用计数(Weak Reference Counting):弱引用计数是在强引用计数的基础上引入了弱引用。弱引用是一种不增加引用计数的引用,它不会阻止对象的释放。弱引用计数的优点是可以解决循环引用的问题,但需要额外的内存开销来管理弱引用。
3. 延迟引用计数(Deferred Reference Counting):延迟引用计数是在强引用计数的基础上引入了延迟释放机制。延迟引用计数会延迟对象的释放,直到没有任何活动的引用。延迟引用计数的优点是可以减少内存分配和释放的频率,提高性能,但需要额外的机制来处理延迟释放。
4. 增量引用计数(Incremental Reference Counting):增量引用计数是在强引用计数的基础上引入了增量引用计数器。增量引用计数器记录了对象的引用数量的增量,而不是实际的引用数量。增量引用计数的优点是可以减少引用计数的更新频率,提高性能,但需要额外的机制来处理增量引用计数器的更新。
总的来说,RC类型分类主要是根据引用计数的实现方式和引入的额外机制来区分的。不同的RC类型有不同的优缺点,适用于不同的场景和需求。
八、蓝牙协议类型及区别?
不同的蓝牙协议决定该设备能具备什么功能,支持的协议越多功能越全面。常见的类型及区别如下:
1.HFP
HFP(手机规格),全名Hands-freeProfil,让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。
2.HSP
HSP(免提规格)在 HSP 的基础上增加了某些扩展功能。使用无线耳机与计算机或其它设备(如手机)通信。连接和配置好后,耳机可以作为远程设备的音频输入和输出接口。
使用设备类型:耳机、手机、PDA、个人电脑、手提电脑。
3.A2DP
A2DP(高级音频传送规格),全名是AdvancedAudio Distribution Profile。蓝牙音频传输模型协定,可传输立体声音频信号,然而并非支持A2DP的耳机就是蓝牙立体声耳机,有双声道才能实现立体声。A2DP相比用于 HSP 和 HFP 的单声道加密,质量要好得多,声音可以达到高清晰度。
4.AVRCP
AVRCP(Audio/VideoRemote Control Profile),也就是音频/视频远程控制规范。用于从控制器(如立体声耳机)向目标设备(如装有 Media Player 的电脑)发送命令(如前跳、暂停和播放),它可以与A2DP或VDP配合使用。
5.OPP
蓝牙通信程序部分需采用于设备之间传输数据对象OPP Profile: Object Push Profile由于OPP profile又细分为OPPC (client)端和OPPS(server)端profile,区别在于只有client端可以发起数据传输的过程,但是附件设备与手机通信的情景中,既有手机发起数据传输请求也有设备侧发起传输请求的需要,所以要在设备中实现OPPC和OPPS两个profile。
6.PBAP
电话号码簿访问协议(PhonebookAccess Profile)
九、数据库中char类型和varchar类型的区别?
char是定长的,比如你定义char(30),就总是占用30字节,如果你输入1个字节,也会补齐长度。
varchar是变长的,定义varchar(30),如果你1字节,就只占1字节(实际会多占一点,用于记录长度等信息)。应该根据实际数据的特点来选择字段类型。十、数据库ID类型定义?
数据类型
从本小节开始,就开始为学习如何操作记录做准备了。
我们先来学习,MySQL中常用的数据类型。
在MySQL中,我们需要了解的数据类型共有以下几种:
- 数值类型。
- 日期类型。
- 字符串类型。
- ENUM和SET类型。
我们一一来看看吧。
数值类型
MySQL支持所有标准SQL数值类型。包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
MySQL支持的整数类型有TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
对于小数的表示,MYSQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在mysql中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
int类型
这里我们先以int为例展开讨论。
create table t1(n1 int(4));
desc t1;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| n1 | int(4) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
insert into t1 values(11);
insert into t1 values(111111);
select n1 from t1;
+--------+
| n1 |
+--------+
| 11 |
| 111111 |
+--------+
由最后的查看结果,我们为int类型设定的宽度为4,结果插入一个6位的也行。这是怎么回事?
create table t2(n1 int(4) zerofill);
desc t2;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| n1 | int(4) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
insert into t2 values(11);
insert into t2 values(111111);
select n1 from t2;
+--------+
| n1 |
+--------+
| 0011 |
| 111111 |
+--------+
可以看到,我们在创建表的时候,为n1
字段加上zerofill
,表示不够4位就填充0。而最后的查询结果告诉我们,如果为int类型指定宽度,则是显示字符的宽度(字符数量),超过这个限制也会显示。
而查询表结构的时候,有个unsigned
,这是无符号的类型。那这是什么意思呢?
create table t3(n1 int);
desc t3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| n1 | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
insert into t3 values(11111111111111111111111111);
insert into t3 values(-11111111111111111111111111);
select n1 from t3;
+-------------+
| n1 |
+-------------+
| 2147483647 |
| -2147483648 |
+-------------+
首先,desc告诉我们int类型的默认显示宽度是11位,而最大表示数值范围是2147483647
,如果你插入的数据是超过这个范围的话。而2147483647
的显示宽度是10位,为什么不是默认的11位呢?这是因为int类型默认类型是有符号的,而有符号的就要考虑正号和负号,而符号仅用1位就能表示。
原因如下:
int的存储宽度是4个Bytes,即32个bit,即2^32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的。
那么如何设置一个无符号的呢?
create table t4(n1 int unsigned);
desc t4;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| n1 | int(10) unsigned | YES | | NULL | |
+-------+------------------+------+-----+---------+-------+
insert into t4 values(11111111111111111111111111);
select n1 from t4;
+------------+
| n1 |
+------------+
| 4294967295 |
+------------+
无符号的需要在int类型指定unsigned
。结果也是没错的。都最开始列举的表中数据一致。
最后:int类型,其实没有必要指定显示宽度,使用默认的就行;如果你的整数范围超过int类型范围,请选用别的数据类型;并且默认的,我们创建的int类型是有符号类型。
float类型
先来看定义:
FLOAT[M, D] [UNSIGNED] [ZEROFILL]
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
DECIMAL[(m[,d])] [unsigned] [zerofill]
float表示单精度浮点数(非准确小数值),M
表示数字总个数,最大值是255;D
是小数点后的数字个数,最大值30。也就是说,如果float(255,30)
意思是,小数位是30位,而整数位就不是255了,而是255-30=225位。它的精准度:随着小数的增多,精度变得不准确。
双精度(double)浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30。它的精准度:随着小数的增多,精度比float要高,但也会变得不准确。
而decimal的准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。它的精准度:随着小数的增多,精度始终准确;对于精确数值计算时需要用此类型。decaimal能够存储精确值的原因在于其内部按照字符串存储。
create table f1(weight float(256,30));
ERROR 1439 (42000): Display width out of range for column 'weight' (max = 255) # 说显示宽度超过了255
create table f2(weight float(255,31));
ERROR 1425 (42000): Too big scale 31 specified for column 'weight'. Maximum is 30. # 告诉我们小数点后的位数最多30位
create table f3(weight float(255,30)); # 这样就没问题了
desc f3;
+--------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| weight | float(255,30) | YES | | NULL | |
+--------+---------------+------+-----+---------+-------+
首先,我们创建的float类型是有符号类型。
同样的,你想创建一个无符号的,也要指定unsigned
。
create table f4(weight float(255,30) unsigned);
desc f4;
+--------+------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------------+------+-----+---------+-------+
| weight | float(255,30) unsigned | YES | | NULL | |
+--------+------------------------+------+-----+---------+-------+
1 row in set (0.01 sec)
在使用浮点型的数据时,我们考虑的核心是关注它们的精度。来看对比。
create table f5(weight float(255,30) unsigned);
create table f6(weight double(255, 30) unsigned);
create table f7(weight decimal(65, 30) unsigned);
insert into f5 values(1.111111111111111111111111111111111111111111111111111);
insert into f6 values(1.111111111111111111111111111111111111111111111111111);
insert into f7 values(1.111111111111111111111111111111111111111111111111111);
我们创建三张不同类型的表,并插入一些数据,并且这些小数位都超过30位。来观察他们的精度:
select weight from f5;
+----------------------------------+
| weight |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
select weight from f6;
+----------------------------------+
| weight |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
select weight from f7;
+----------------------------------+
| weight |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
由各自的查询结果可以看到,float类型的精度只有前7位是精确的;double类型的精度是15位;而decimal则保留完整的精度,毕竟是字符串形式的存储么。 但是decimal虽然精度较高,但是它也是有限制的,因为它的数字总大小为65位,所以抛出小数位的30位,还剩30位整数位。
最后,最后,这里只是说的显示宽度仅是在int中使用,其他数据类型宽度是存储限制。比如BIT类型。
BIT
create table b1(b bit(1));
desc b1;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| b | bit(1) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
insert into b1 values(0);
insert into b1 values(1);
insert into b1 values(2);
select b from b1;
+------+
| b |
+------+
| |
| |
| |
+------+
首先了解,字段b
的类型是bit,宽度是1,那能表示多少数值呢,一个bit,只能表示0和1两个。但是通过查询发现,跟我们想要的结果不一样。
这是为什么,bit类型存储是以二进制存储到硬盘上的。所以,我们想要查询到我们想要的值,还要借助MySQL提供给我们的函数bin()
和hex()
,意思是返回二进制值的字符串形式表示和十六进制的表示形式。
select bin(b) from b1;
+--------+
| bin(b) |
+--------+
| 0 |
| 1 |
| 1 |
select hex(b) from b1;
+--------+
| hex(b) |
+--------+
| 0 |
| 1 |
| 1 |
+--------+
可以看到,字段b
的bit(1)
类型只能表示0和1,而插入的2超出了范围。所以,你在用的时候,需要注意:
create table b2(b bit(2));
insert into b2 values(2);
select bin(b) from b2;
+--------+
| bin(b) |
+--------+
| 10 |
+--------+
可以看到,2的二进制形式是10
。
时间类型
日期类型有:
- DATE(YYYY-MM-DD(1000-01-01/9999-12-31)),2019-07-31,出生年月日
- TIME(HH:MM:SS('-838:59:59'/‘838:59:59’)),16:40:40,下班时间
- DATETIME(YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y))、2019-07-31 16:40:40,注册时间、文章发布时间、员工入职时间
- TIMESTAMP(YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时))、2019-07-31 16:40:40
- YEAR(YYYY(1901/2155))、2019,历史大事件,出生年
来个示例:
create tabled1(
born_date date,
get_time time,
reg_time datetime,
born_year year # 最后一个字段后面不要有逗号
);
insert into d1 values(
'1999-11-11',
'18:30:00',
'2018-11-11 11:11:11',
'1999' # 不要写成18/30/30
);
来查询:
desc d1;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| born_date | date | YES | | NULL | |
| get_time | time | YES | | NULL | |
| reg_time | datetime | YES | | NULL | |
| born_year | year(4) | YES | | NULL | |
+-----------+----------+------+-----+---------+-------+
select * from d1;
+------------+----------+---------------------+-----------+
| born_date | get_time | reg_time | born_year |
+------------+----------+---------------------+-----------+
| 1999-11-11 | 18:30:00 | 2018-11-11 11:11:11 | 1999 |
+------------+----------+---------------------+-----------+
再来掌握一个now()
函数:
insert into d1 values(now(), now(), now(), now());
select * from d1;
+------------+----------+---------------------+-----------+
| born_date | get_time | reg_time | born_year |
+------------+----------+---------------------+-----------+
| 1999-11-11 | 18:30:00 | 2018-11-11 11:11:11 | 1999 |
| 2019-07-31 | 16:57:51 | 2019-07-31 16:57:51 | 2019 |
由第二行记录可以发现,各类型都按照自己的规则截取所需的日期数据。
了解:datetime与timestamp的区别
create table d2(x datetime, y timestamp);
desc d2;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| x | datetime | YES | | NULL | |
| y | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
insert into d2 values(Null, Null);
insert into d2 values('1111-11-11','1111-11-11');
select * from d2;
+---------------------+---------------------+
| x | y |
+---------------------+---------------------+
| NULL | 2019-07-31 17:05:43 |
| 1111-11-11 00:00:00 | 0000-00-00 00:00:00 |
+---------------------+---------------------+
通过上述验证分析,虽然这两种日期格式,都能满足我们大多数使用场景,但是在某些情况下,它们也有自己的优劣之分,来看看它们的区别:
- DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
- DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。
- DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
- DATETIME的默认值为null,TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
字符串类型
字符串类型这里需要重点掌握的就是char和varchar两个,存放名字、性别、密码、文本内容等等。
先看它们的区别,注意,长度指的是字符的长度:
- char,定长,简单粗暴,浪费空间,存取速度快。
- 字符长度范围:0~255,一个汉字是一个字符,utf8编码一个普通汉字占用3个字节。
- 存储:如果存储的值,不满足指定的长度时,会往右填充空格来满足长度,例如指定长度为10,存储大于10个字符报错,小于10个字符会用空格填充,凑够十个字符。
- 查询(或称检索):查询出的结果会自动删除尾部的空格,除非我们打开
pad_char_to_full_length
SQL模式
set sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'
- varchar,可变长度,存储更精确,但存取速度慢。
- 字符长度范围:0-65535,在utf8编码中,如果大于21844会提示用其他类型 。mysql行最大限制为65535字节。
- 存储:varchar类型存储的是真实内容,而不是用空格填充,如存储
abc
,尾部的空格也会被存储起来。注意,varchar类型会在真实数据前面加1~2个Bytes前缀,用来存储真实数据的bytes字节数,1~2Bytes最大表示65535个数字,正好符合MySQL对row的最大字节限制。如果真实的数据小于255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255);如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)。 - 查询:尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容。
char VS varchar:存储范围验证
create table c1(s char(256));
ERROR 1074 (42000): Column length too big for column 's' (max = 255); use BLOB or TEXT instead
create table c2(s char(255));
create table c3(s varchar(21845));
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
create table c4(s varchar(21844));
create table c5(s varchar(65534));
通过打印结果,可以看到,char类型,如果长度超过255,就提示我们字段长度最大是255;varchar的列长度如果超过21844,提示我们varchar类型的最大行大小为65535。
但是最后的c5
却成功创建,这是为什么呢?我们来看它的表结构:
desc c4;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| s | varchar(21844) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
desc c5;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| s | mediumtext | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
可以看到,c5
表的字段类型已经变成了mediumtext
,而不是varchar
类型。
char VS varchar:存储长度验证
create table c6(s char(3));
create table c7(s varchar(3));
insert into c6 values('abcd');
insert into c6 values('生存还是毁灭');
insert into c7 values('abcd');
insert into c7 values('生存还是毁灭');
再来看查询结果:
select s from c6;
+-----------+
| s |
+-----------+
| abc |
| 生存还 |
+-----------+
select s from c7;
+-----------+
| s |
+-----------+
| abc |
| 生存还 |
+-----------+
可以看到,无论是char还是varchar;无论是中文还是其他,它们限制的是字符个数。
char VS varchar:定长与可变长度
再来研究它们之间的特点的区别,也就是定长和可变长度的区别。
我们通过表格来看看他们的存储关系:
Value | CHAR(4) | 存储需求 | VARCHAR(4) | 存储需求 |
---|
不要被5bytes所迷惑,abcd
占4个字节,还有一个字节存储该字符串的长度。
先了解两个函数:
- length:查看字节数。
- char_length:查看字符数。
create table c8(s1 char(3), s2 varchar(3));
desc c8;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| s1 | char(3) | YES | | NULL | |
| s2 | varchar(3) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
insert into c8 values('a', 'b');
select s1, s2 from c8;
+------+------+
| s1 | s2 |
+------+------+
| a | b |
+------+------+
现在看是啥也看不出来,所以,我们用上char_length
函数:
select char_length(s1), char_length(s2) from c8;
+-----------------+-----------------+
| char_length(s1) | char_length(s2) |
+-----------------+-----------------+
| 1 | 1 |
+-----------------+-----------------+
这也看不出来啥呀,a和b不就是各占用一个字符长度么。
这是因为啊,我们在查询char类型数据的时候,MySQL会默默的删除尾部的空格(装作我并没有浪费空间!),我们来让它现原形:
SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
select char_length(s1), char_length(s2) from c8;
+-----------------+-----------------+
| char_length(s1) | char_length(s2) |
+-----------------+-----------------+
| 3 | 1 |
+-----------------+-----------------+
这个时候再看,是不是现原形了,char类型占用指定的3个字符宽度,当然,一个英文字符也占用一个字节。而varchar就占用一个字符。
中文也一样:
insert into c8 values('你', '好');
select char_length(s1), char_length(s2) from c8;
+-----------------+-----------------+
| char_length(s1) | char_length(s2) |
+-----------------+-----------------+
| 3 | 1 |
| 3 | 1 |
+-----------------+-----------------+
这就是我们使用char和varchar时需要注意的点。
小结:
InnoDB存储引擎:建议使用VARCHAR类型 单从数据类型的实现机制去考虑,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。
但对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。 其他字符串系列(效率:char>varchar>text)
- TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
- BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
- BINARY系列 BINARY VARBINARY
text:text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。
枚举与集合
有些情况,我们需要在一堆选项中选择一个,或者选择多个,如单选框和复选框。 那,在MySQL的字段中,字段的类型也可以有单选和多选。
- enum单选,只能在给定范围内选一个值,如果性别;适用于给定范围后续不会发生变化的场景;另外数字类型不适用枚举。
- set多选,在给定的范围聂选择多个值,如爱好。
create table user1(
id int,
name char(5),
sex enum('male', 'female', 'unknow'),
hobby set('eat', 'sleep', 'play mobile phone')
);
desc user1;
+-------+----------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| sex | enum('male','female','unknow') | YES | | NULL | |
| hobby | set('eat','sleep','play mobile phone') | YES | | NULL | |
+-------+----------------------------------------+------+-----+---------+-------+
insert into user1 values(1, '张三', 'male', 'eat,sleep');
select * from user1;
+------+-----------+------+-----------+
| id | name | sex | hobby |
+------+-----------+------+-----------+
| 1 | 张三 | male | eat,sleep |
+------+-----------+------+-----------+
如果是set类型,多个参数以逗号隔开。 这里,我们也可以设置默认值,如果用户不填写的话:
create table user2 (id int, sex enum('male', 'female', 'unknow') default 'male');
insert into user2(id) values(1);
insert into user2 values(2, 'female');
select * from user2;
+------+--------+
| id | sex |
+------+--------+
| 1 | male |
| 2 | female |
+------+--------+
根据查询结果可以看到,如果性别字段传值就用我们传的值,不传就用默认的。
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...