【mysql知识点】锦集
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/129908254
出自【进步*于辰的博客】
如果大家想要了解mysql使用细节和经验,请查阅博文【【mysql细节、经验】锦集】。
注:
大家在本文中会看到“xchar/nxchar”这样的未知数据类型,这是我自定义的,目的是便于阐述。
自定义规范:
形式一:x 代指 n。
xchar → char 和 nchar;
xvarchar → varchar 和 nvarchar;
形式二:x 代指 var。
xchar → char 和 varchar;
nxchar → nchar 和 nvarchar;
注:这样定义,对大家的阅读肯定带来不便,不过,这对阐述是有所裨益的,请耐心看完。注意:形式一优先级高于形式二。
文章目录
- 1、其他知识点链接
- 2、关于int族数据类型存储数据范围
- 2.1 数据范围通式
- 2.2 关于类型定义时所指定长度的说明
- 3、关于char族数据类型的选择问题
- 3.1 char与nchar的区别
- 3.2 xchar和xvarchar的区别
- 3.3 类型选择参考
1、其他知识点链接
- 流程控制语句;
- 存储过程;
2、关于int族数据类型存储数据范围
参考笔记二,P62.1、P63.7。
2.1 数据范围通式
无论何种类型,数据存储范围都取决于“以何种方式存储数据”。大多数情况下,存储方式都是“二进制”,也包括int族数据类型。
因此,int族数据类型的数据存储范围由所占二进制的位数决定。
int族数据类型的所有类型如下:
tinyint,占1字节,数据范围:-128 ~ 127;smallint,占2字节;mediumint,占3字节;int,占4字节;bigint,占8字节;
从初步判断,这5种int类型的数据存储范围是不确定的。因为二进制分为无符号二进制和有符号二进制2种形式,即int族的存储方式有2种可能。例如:tinyint,若采用有符号二进制进行存储,则数据存储范围是:-128 ~ 127,;否则则是:0 ~ 255。
为什么8位无符号二进制的数据存储范围是:
0 ~ 255,而8位有符号二进制的数据存储范围是:-128 ~ 127。
详述请查阅博文【关于对【8位二进制的整数表示范围、常见位运算符和进制间转换】的理解与简述】的第1项。
为了验证其采用哪种二进制形式,作如下测试,


上图数据表的字段syllabus_id的数据类型是tinyint,图一存储128报错:超出值范围;图二存储127,可提交。
因此,tinyint类型的数据存储范围是:-128 ~ 127。
故,int族数据类型采用有符号二进制的形式存储数据(能够存储负数)。
结论:
int族数据类型的数据存储范围通式:-2{8n-1} ~ 2{8n-1} - 1(n是所占字节数)。
示例:
tinyint,占1字节。数据存储范围:-2(8*1-1) ~ 2{8*1-1}- 1 →-128 ~ 127;smallint,占2字节。数据存储范围:-2{8*2-1} ~ 2{8*2-1} - 1 →-32768 ~ 32767。
2.2 关于类型定义时所指定长度的说明
先说结论:
int族数据类型存储数据范围取决于所占二进制的位数,与定义时指定的长度无关,如:tinyint(5),并不是表示此字段可以存储5位数的整数,其中的5无意义。因此,数据范围仍是: -128 ~ 127。
注意:
上述结论针对的是int族数据类型,若是其他族数据类型则不同。比如:decimal(5, 2)表示“2位小数”;char(20)表示“占20个字节,可存储20个字符或10个汉字”。
3、关于char族数据类型的选择问题
参考笔记二,P62.2/4、P63.5。
3.1 char与nchar的区别
区别: 存储方式不同。
char以字节存储,一个字符占1个字节,一个汉字占2个字节。如:char(20),可存储20个字符或10个汉字,共占20个字节;nchar以字符存储,一个字符或汉字都占2个字节。如:nchar(20),可存储20个字符或汉字,共占40个字节。
3.2 xchar和xvarchar的区别
区别: 是否定长。
举个栗子:
char(20),表示最多可存储20个字符或10个汉字,固定占20字节空间。假设仅存储了4个字符,则后16个字节为空;varchar(20),表示最多可存储20字节数据。假设已存储了4个字符,则共占4字节空间。
同理:
nchar(20),表示==最多可存储20个字符或汉字,固定占40字节空间。假设仅存储了4个字符,则后32个字节为空;nvarchar(20),表示最多可存储40字节数据。假设已存储了4个字符,则共占8字节空间。
补充说明:
在实际应用中,一个汉字所占字节数取决于编码格式。例如,若编码格式是GBK/ISO-8859-1,则一个汉字占2个字节,此时char(20)最多可存储10个汉字;而若编码是UTF-8,则一个汉字占3个字节,此时char(20)最多可存储6个汉字和2个字符。
注:创建数据库时普遍设置为UTF-8。
因为我的电脑默认编码是GBK,因此,上述是按照“一个汉字占2个字节”的标椎进行阐述的。
3.3 类型选择参考
xchar比xvarchar占据空间大,但执行速度快。因为 xchar 的索引效率高,不过,在存储数据时,建议将数据前后多余的空格去除(trim());- 若所存储的数据集中包含字母、数字、汉字或其他语言字符,则
nxchar比xchar合适。因为 nxchar 使用Unicode统一编码,能降低乱码的几率。(因为一般情况下,数据库的编码兼容性强于程序编码。因此,数据存储时不会乱码,但读取数据时可能会) - 当所存储数据长度较短或数据集的长度近似时,使用
xchar。举个例:身份证号,18或19位,选择char(21)或nchar(21);(为什么是21,请大家参考第5点)
注:有关数据长短,与所占字节数无关,故这里的 x 代指 n。 xchar所占空间是一次性分配的,而xvarchar是根据实际长度分配的。若所存储的数据在修改后相较于修改前短很多,则容易产生大量碎片,需要额外的导入和导出工作来清除碎片。因此,选择哪种char类型需要预测后续数据的变动情况;- 同样是存储90个字符,
varchar(100)与varchar(200)是不同的。若此字段涉及到文件排序或基于磁盘的临时表,使用varchar(200)会给内存作业造成影响。因此,在定义长度时,需评估合适长度。一般情况下,定义的长度为所存储数据的最大长度的110%左右最佳。
本文持续更新中。。。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
