数据库
MySQL 数据库类型:全面了解不同数据库类型的特点
一、MySQL 数据库类型:全面了解不同数据库类型的特点
MySQL 数据库类型简介
MySQL 是一种流行的关系型数据库管理系统(RDBMS),广泛应用于Web应用程序、企业解决方案和云计算等领域。MySQL 提供了多种不同的数据库类型,每种类型都有其独特的特点和适用场景。
1. InnoDB
InnoDB 是 MySQL 默认的存储引擎,具有高可靠性和高性能的特点。它支持事务、行级锁定和外键约束,适用于需要处理大量并发读写操作的应用程序。
2. MyISAM
MyISAM 是 MySQL 最早引入的存储引擎之一,它简单、快速,适合于读密集型应用。然而,MyISAM 不支持事务和行级锁定,因此不适合需要数据一致性和并发写操作的场景。
3. Memory
Memory 存储引擎将表数据存储在内存中,读写速度非常快。然而,由于数据存储在内存中,因此它对于数据量较大或需要持久化数据的应用程序并不适用。
4. Archive
Archive 存储引擎使用高度压缩的格式来存储数据,适用于存档和数据归档等应用场景。由于数据压缩和只读特性,它不适合频繁的读写操作。
5. NDB Cluster
NDB Cluster 是一种可扩展的、高可用的存储引擎,特别适用于分布式环境。它支持数据的分区和复制,可以实现高性能和高可靠性的数据库集群。
6. CSV
CSV 存储引擎将数据以逗号分隔的形式存储在文本文件中,适用于处理大量简单数据的场景。然而,CSV 存储引擎不支持事务和索引,因此在需要复杂查询和数据一致性的场景中不适用。
7. Blackhole
Blackhole 存储引擎接收写入操作但不实际保存数据,适用于在主从复制中做数据同步。
总结
MySQL 提供了多种不同的数据库类型,每种类型都有其适用的场景和特点。选择合适的数据库类型对于应用程序的性能和可靠性至关重要。我们可以根据应用程序的需求和数据特点来选择合适的数据库类型。
感谢您阅读本文,我们希望通过本文的介绍,您对于 MySQL 数据库类型有了更全面的了解,并能在实际应用中做出更明智的选择。
二、数据库int类型长度详解:不同数据库的int类型存储限制
在数据库设计和使用过程中,我们经常会接触到int类型,它在存储整数数据时起着重要作用。然而,不同的数据库对于int类型的存储长度限制是不同的,这也给我们的数据处理带来了一定的挑战。接下来,我们将详细解析各种常见数据库中int类型的存储限制,帮助您更好地理解和运用数据库int类型。
MySQL中int类型长度限制
在MySQL中,int类型是一种常用的整数数据类型。它可以存储范围较大的整数数据,其长度限制为4个字节,即32位。这意味着它可以表示的整数范围大约在-21亿到21亿之间。
SQL Server中int类型长度限制
在SQL Server中,int类型同样是常见的整数数据类型。它的长度限制也是4个字节,与MySQL中的int类型相同。因此,它也可以表示的整数范围大约在-21亿到21亿之间。
Oracle中int类型长度限制
在Oracle数据库中,并没有类似于MySQL和SQL Server中int类型的概念。它通常使用NUMBER来表示整数数据,而不需要像其他数据库那样显式地指定长度。因此,对于整数数据的存储范围并没有像int类型那样的固定限制。
PostgreSQL中int类型长度限制
在PostgreSQL中,int类型又被称为INTEGER,其长度限制为4个字节,与MySQL和SQL Server中的int类型相同。它可以表示的整数范围也大约在-21亿到21亿之间。
不同数据库int类型长度比较
通过以上介绍,我们可以看出,不同数据库中int类型的长度限制基本上是一致的,都是4个字节。这意味着在进行数据库迁移或者跨数据库应用开发时,int类型的整数数据基本上可以保持兼容,而不会出现数据溢出的问题。
综上所述,不同数据库中int类型的长度限制基本一致,大多数情况下都是4个字节。因此,在实际的数据库设计和应用开发中,我们可以针对int类型的存储特点,更加灵活地进行数据处理和存储。
感谢您阅读本文,希望通过这篇文章,您能更加清晰地了解不同数据库中int类型的长度限制,为数据库设计和开发提供更多参考和帮助。
三、数据库中不同数字类型的比较
引言
在数据库中,数字类型是最常用的数据类型之一。不同的数字类型具有不同的特性和用途,并且在存储、运算和比较方面也存在差异。本文将介绍数据库中常见的数字类型,包括整型、浮点型和定点型,并探讨它们在数据存储和比较中的优缺点。
整型
整型是数据库中表示整数值的数字类型。它可以存储整数,但不能存储小数部分,因此适用于不需要精确小数位的情况。整型的存储空间相对较小,通常占用4字节或8字节,因此在存储和计算性能方面具有明显优势。然而,由于无法表示小数,整型在涉及到小数计算和比较时可能出现精度损失。
浮点型
浮点型是数据库中表示带有小数部分的数字类型。它可以存储小数,但在存储和计算过程中可能会出现舍入误差。浮点型的存储空间相对较大,通常占用4字节、8字节或更多,因此在存储和计算性能方面相对整型较低。然而,浮点型在需要精确表示小数时是必需的,例如金融领域的货币计算。
定点型
定点型是数据库中表示带有指定小数位数的数字类型。它可以存储指定精度的小数,避免了浮点型的舍入误差。定点型的存储空间相对较大,通常占用8字节、16字节或更多,因此在存储和计算性能方面相对较低。然而,定点型在需要精确表示指定小数位数的场景下非常有用,例如科学实验的测量数据。
比较与选择
在数据库中,比较数字类型的值是非常常见的操作。对于整型和定点型,通常可以直接进行比较,判断大小关系。而对于浮点型,则需要使用特定的比较函数来处理舍入误差。在选择和过滤数据时,正确选择适当的数字类型比较方式非常重要,以确保数据的准确性和一致性。
结论
在数据库中,不同的数字类型具有不同的特性和用途。根据实际需求,选择适当的数字类型来存储和比较数据是至关重要的。整型适用于不需要精确小数位的整数值,浮点型适用于带有小数部分的数值计算,而定点型则提供了指定精度的小数表示。合理使用和比较数字类型有助于提高数据库的性能和数据准确性。
感谢您阅读本文,希望对您在数据库中选择数字类型时有所帮助。
四、数据库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 |
+------+--------+
根据查询结果可以看到,如果性别字段传值就用我们传的值,不传就用默认的。
五、长字段类型 - 了解不同数据库中的长字段类型
长字段类型介绍
在数据库设计中,长字段类型指的是可以存储大容量数据的字段类型。不同的数据库系统提供了各自的长字段类型,用于存储文本、二进制数据或者其他大型数据。
MySQL中的长字段类型
在MySQL中,长字段类型主要包括:
- TEXT:用于存储较长的文本数据,可以存储最大长度为65,535个字符。
- MEDIUMTEXT:用于存储更长的文本数据,可以存储最大长度为16,777,215个字符。
- LONGTEXT:用于存储非常长的文本数据,可以存储最大长度为4,294,967,295个字符。
- BLOB:用于存储二进制数据,可以存储最大长度为65,535个字节。
- MEDIUMBLOB:用于存储更长的二进制数据,可以存储最大长度为16,777,215个字节。
- LONGBLOB:用于存储非常长的二进制数据,可以存储最大长度为4,294,967,295个字节。
PostgreSQL中的长字段类型
在PostgreSQL中,长字段类型主要包括:
- TEXT:用于存储较长的文本数据,没有实际长度限制。
- BYTEA:用于存储二进制数据,没有实际长度限制。
- JSONB:用于存储JSON格式的数据,没有实际长度限制。
Oracle中的长字段类型
在Oracle中,长字段类型主要包括:
- CLOB:用于存储较长的字符数据,可以存储最大长度为4GB。
- NCLOB:用于存储较长的Unicode字符数据,可以存储最大长度为4GB。
- BLOB:用于存储较长的二进制数据,可以存储最大长度为4GB。
除了上述数据库系统,其他数据库如SQL Server、SQLite等也提供了类似的长字段类型。对于不同的应用场景,我们可以根据需求选择合适的长字段类型来存储大容量的数据。
感谢您阅读本文,希望通过本文的介绍,您对长字段类型有了更深入的了解,并能在数据库设计中正确选择合适的长字段类型来存储大容量数据。
六、探索不同类型的区块链数据库
引言
随着区块链技术的迅速发展,人们对于区块链数据库类型的讨论也越来越多。区块链数据库是区块链的核心组成部分,负责存储和管理交易数据。不同的区块链数据库类型具有各自的特点和适用场景。在本文中,将探索几种常见的区块链数据库类型,帮助读者更好地了解并选择适合自己需求的区块链数据库。
1. 关系型数据库
关系型数据库是一种基于表结构的数据库类型,使用SQL进行数据查询和操作。它具有数据一致性和可靠性高的优点,适合于一些对于数据完整性要求较高的场景。然而,由于数据之间的关联和索引操作,关系型数据库在处理大规模数据时会面临性能瓶颈。
2. 文档数据库
文档数据库是一种面向文档格式的数据库类型,存储的是以JSON或XML等格式表示的文档数据。文档数据库具有灵活的数据模型和高度可扩展性的优点,适用于需要频繁变更的数据结构和大量无结构化数据的场景。然而,文档数据库在多节点同步和数据处理效率方面仍有待改进。
3. 键值数据库
键值数据库是一种以简单的键值对形式存储数据的数据库类型,适合于存储大量无结构化数据和高并发读写操作的场景。键值数据库具有快速的读写性能和高度可伸缩性的优点,但在数据查询和复杂数据处理方面相对不足。
4. 图数据库
图数据库是一种专门用于存储图结构数据的数据库类型,通过节点和边的关系表示数据之间的连接。图数据库在处理复杂的关系型数据和网络分析等场景中具有显著优势。然而,图数据库在存储大规模数据和处理密集计算时性能较低。
5. 列式数据库
列式数据库是一种将数据按列存储的数据库类型,适合于大规模数据的高效读取和聚合运算。列式数据库具有高度压缩和查询性能优化的特点,适用于需要大规模数据分析和数据仓库等场景。然而,由于数据格式的不连续性,列式数据库在数据更新和单条数据查询上相对较慢。
结论
不同类型的区块链数据库各有千秋,适用于不同的应用场景。关系型数据库适合对数据完整性有较高要求的场景,文档数据库适用于频繁变更的数据结构,键值数据库适合存储大量无结构数据,图数据库适合处理复杂的关联数据,而列式数据库适合大规模数据分析和数据仓库。在选择合适的区块链数据库类型时,需要充分考虑自身的需求和项目特点,以及各类型数据库的优缺点。
感谢您阅读本文,希望能够对您了解和选择区块链数据库类型提供帮助。
七、了解不同类型的区块链数据库
介绍
区块链技术作为一种去中心化的分布式数据库系统,已经在各个领域产生了广泛的应用。区块链数据库不同于传统的关系型数据库,它具有高度的安全性、透明性和可靠性。本文将介绍几种常见的区块链数据库类型,以帮助读者更好地了解区块链技术的应用。
1. 全节点数据库
全节点数据库是区块链网络中保存完整区块链数据的节点。它存储了整个链上的所有交易数据,并能验证和处理新的交易。全节点数据库具有高度的安全性和去中心化特性,在比特币等公有链中广泛应用。
2. 权威节点数据库
权威节点数据库是授权的节点,由特定的实体或组织管理。它的主要作用是验证和确认交易,并将其添加到区块链中。与全节点数据库相比,权威节点数据库更加高效,适用于私有链或联盟链等场景。
3. 分片数据库
分片数据库将区块链网络分成多个区块,每个区块维护一部分数据。这种数据库类型可以提高区块链系统的扩展性和性能,在大规模应用场景中具有重要意义。
4. 混合数据库
混合数据库是将多种数据库类型组合在一起的解决方案。通过充分发挥各种数据库类型的优势,混合数据库可以提供更强大的功能和性能,适应不同的业务需求。
5. 专用数据库
专用数据库是为特定的应用场景设计的区块链数据库。例如,医疗保健领域可以使用专用数据库来存储和管理患者的医疗数据,以实现隐私保护和数据共享的平衡。
总结
区块链数据库类型包括全节点数据库、权威节点数据库、分片数据库、混合数据库和专用数据库。不同类型的数据库适用于不同的应用场景,读者可以根据具体需求选择合适的数据库类型。区块链技术的发展将继续推动各行各业的创新和变革。
感谢您阅读本文,希望能为您对区块链数据库类型的了解提供帮助。
八、网络数据库:了解不同类型的数据库及其应用
什么是网络数据库
网络数据库是指可以通过网络进行数据存储和访问的数据库系统。它提供了一种分布式的数据存储和管理机制,允许用户远程访问和操纵数据。
常见的网络数据库
下面是一些常见的网络数据库,及其应用领域:
- 关系型数据库:关系型数据库使用表格和关系来组织数据。它们以标准化的方式存储数据,确保数据的统一性和完整性。MySQL、Oracle和SQL Server是常见的关系型数据库,广泛用于企业级应用程序。
- 键值数据库:键值数据库以键值对的形式存储数据。这种数据库非常适合存储大量的非结构化数据,如缓存数据、用户信息和配置文件等。Redis和Memcached是常见的键值数据库。
- 文档数据库:文档数据库将数据存储为文档的形式,这些文档可以是JSON、XML或其他格式。它们通常用于存储半结构化和多模型数据。MongoDB和Couchbase是常见的文档数据库。
- 列存储数据库:列存储数据库将数据按列存储,而不是按行存储。它们适用于大数据分析和处理,因为可以高效地查询和分析特定的列。HBase和Cassandra是常见的列存储数据库。
- 图形数据库:图形数据库以图的形式存储数据,其中节点表示实体,边表示实体之间的关系。它们适用于存储具有复杂关系和网络结构的数据,如社交网络和知识图谱。Neo4j和RedisGraph是常见的图形数据库。
网络数据库的应用
网络数据库在各个行业和领域都有广泛的应用:
- 企业级应用:关系型数据库广泛用于企业级应用,如客户关系管理(CRM)、企业资源计划(ERP)和供应链管理(SCM)等。
- 云计算和大数据:分布式数据库和列存储数据库被广泛用于云计算和大数据领域,以实现高可用性和高性能的数据处理。
- 社交网络和电子商务:图形数据库可以高效地存储和查询社交网络的关系和连接信息,帮助社交媒体平台和电子商务网站实现个性化推荐和社交分析。
- 物联网和智能设备:文档数据库和键值数据库适用于存储物联网设备生成的半结构化数据,如传感器数据和设备配置信息。
以上只是网络数据库的一些常见类型和应用领域,随着技术的发展和需求的变化,未来还会出现更多新的数据库类型和应用场景。
感谢您阅读本文,希望通过本文您可以了解不同类型的网络数据库及其在各个领域的应用。
九、Access数据库类型?
access的数据库类型是关系型数据库。Access是由微软发布的关系数据库管理系统;它可处理字段、关系和规则的复杂计算,以便您能够集中精力处理项目。
关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数据项的特殊收集体,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。
关系数据库的定义造成元数据的一张表格或造成表格、列、范围和约束的正式描述。每个表格(有时被称为一个关系)包含用列表示的一个或更多的数据种类。 每行包含一个唯一的数据实体,这些数据是被列定义的种类。
十、erp数据库类型?
ERP系统管理数据类型包括:
一、基础数据
基础数据主要包括公司的客户信息、办公信息、员工信息、账号权限等。只要将一条信息录入系统中,其后可直接对已有信息进行快速复制,再对差异信息就行修改即可,为快速添加相似的信息加快速度。
ERP系统管理
二、工程数据
工程数据主要包括科学的编码体系、物料主文件、物料清单BOM、产品工艺路线等。工程数据库的工作量较大且是一项长期的工作,因此,很多企业的ERP系统都会具有成批导入的功能,这样可以减少客户手动录入的麻烦,节约录入时间,以便提高工作效率。
三、库存数据
库存数据主要有仓库基础数据、仓库类型、库位的设置,仓库交易类型参数等。库存数据要求准确可靠,所以在ERP系统中不论是仓库的收发管理,还是借料、补料、物料退换,都有严格的操作流程,系统还可针对各公司不同情况建立对仓管员有效的绩效考核方式,来加强对仓管管理相关工作。
除了数据的整理之外,ERP系统也十分重视数据安全问题。对于安全性的各个维度我们都做了工作,包括账号保护、登录限制、数据加密、数据备份、数据恢复、离线分析、权限控制、硬件加密等。用户只管使用,安全性的东西都写在了代码里,并都是以权限性质出现,让客户用的省心、舒心、更放心。
热点信息
-
在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)下载和安装最新版本...