🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注
前言
哈哈哈哈,又有一段时间没有更新啦!!
国庆节大家有没有来重庆,玩安逸了没有 ~~真的太舒服! 😜😜😜😜😜
好了,回到正题吧,,嘿嘿,今天我们来讨论一下SQL Server 2000
中的binary类型
这是一种用于存储二进制数据
的数据类型
, 这种类型很多初学者都忽略了!
那么接下来我们来对这个类型的详细展开探讨!
回顾一下固定和可变
固定长度(Fixed)
之前我们说过, 当我们说某个字段是固定长度的时候,意味着这个字段在数据库中占用的空间大小是预先确定且不会改变的!
比如某个数据类型, 无论我们实际存储的长度有多长(前提条件:只要不超过n个长度范围), 那么数据库都会为这个字段分配n个长度的空间
如果存储的长度小于n,数据库可能会用空格
或者其他填充字符
来填充剩余空间,以确保总长度达到n。
当然这些填充的空格
在检索数据时通常会被忽略或自动移除!
可变长度(Variable)
相对固定长度
而言可变长度
意味着字段在数据库中占用的空间大小可以根据实际存储的数据量来动态调整
varchar(n)为例,这里的n
指定了字段可以存储的最大字符数,
但实际占用的空间将仅包括存储字符串所需的字符加上一个额外的长度字节(在某些数据库系统中可能是两个字节)来记录字符串的实际长度的, 这意味着如果我们存储的字符串很短,那么字段占用的空间也会相应减少!
binary类型基本概述
在SQL Server 2000
中,binary数据类型
用于存储固定长度
的二进制数据!
这种数据类型与文本数据不同,二进制数据
不是以字符形式
存储,而是以字节形式
存储
通常我们会使用这种数据类型来存储图像、音频、视频
文件, 以二进制`的形式存储它们,以及任何不是文本的数据也都是可以的!
binary类型的特点性能
固定长度
binary(n)
中的n指定了二进制数据的长度,这个长度是固定的。
如果实际存储的数据长度小于n,则剩余的部分将被填充以满足长度要求, 这个我们上面已经说过了!
举个栗子
你定义了一个binary(10)
的字段,只存储了5个字节的数据,数据库也会为其保留10
个字节的空间,并用一些方式,例如(0x00)
去填充剩余的5个字节!
长度范围
n的取值范围是从1~8000
那么这意味着binary类型
可以存储的最大长度是8000字节
存储效率
对于固定
和可变
长度的存储效率,跟我们前面说的也一样!
比如:binary数据
是固定长度
,在存储数据
的时候, 可能不如可变长度
的varbinary类型
高效,特别是对于长度变化较大的数据!
但是在某些情况下,固定长度的数据可以带来性能上的优势,这都是要看实际情况~
就像是binary类型
通常用于存储不需要经常变更的二进制数据
,哈希值、加密密钥、小型二进制文件
, 这样性能提升非常明显!
binary类型使用方式
由于binary类型
是直接存储二进制数据
,我们不需要进行任何额外的转换或编码, 直接插入的数据会被直接转换为0x
开头的数据,保存在字段中!
也就是说在SQL Server
中,当你插入数据到binary
或varbinary
字段的时候,数据会以十六进制(hexadecimal)
的形式进行存储,通常以0x
前缀来表示这是一个十六进制数
这是数据库内部表示二进制数据的一种方式!
当存储二进制数据时,它将这些数据转换为十六进制格式
,并在前面加上0x
前缀。
这样做可以确保数据的完整性
和准确性
,并便于数据库在内部处理和存储这些数据。
获取binary数据
我们可以使用SELECT语句
从数据库中查询二进制数据。
查询结果将显示带有0x前缀
的十六进制字符串
如图
当然你一定会想,显示这样的数据有什么用?我们又看不懂~~
当然不是为了让我们看懂啦!!
我们在实际应用的时候,可以把这种数据转换为实际的原数据,来进行验证也可以!
比如 当使用php提取出来的这个字段数据为十六进制, 可以使用hexdec()函数
将十六进制
字符串转换为十进制数
如图
binary也可以存储图片 你信不信
如果存储的是一个图片,并且已经以二进制形式从数据库中检索出了这张图片的数据,那么我们可以使用PHP
来输出这张图片并将其显示在网页上。
通常涉及到设置正确的HTTP头信息
,并将二进制数据
直接发送到客户端浏览器
进行显示!
这个我们在后面实战项目的时候,会有具体演示~
varbinary类型
varbinary(n)
是一种可变长度
的二进制数据类型
,其中n
的取值范围也是从1~8000
。
与binary
类型比较的情况下,varbinary
更加灵活,因为它只存储实际的数据长度和数据本身,而不需要额外的填充字节,这让varbinary类型
存储长度变化
较大的二进制数据时
更加高效!
其他二进制类型
在SQL Server 2000
中还有一个image数据类型
, 它是用于存储大量二进制数据
最长可达231-1 个字节!
但是在后续SQL Server
版本的中,·image类型·已被废弃,并被varbinary(max)类型
代替, 这个可以存储相当于2GB
字节的数据!
如果你依旧在使用SQL Server 2000
, 并且需要存储大于8000字节
的二进制数据,那么可以使用image类型
!
为了与后续版本的兼容性,我建议在开发中使用varbinary(max)
类型是一样的!
应用场景
基本上使用binary类型
存储数据时,我们应该要注意以下一些情况进行选择
比如说数据长度
可能会变化很大,那么应考虑使用varbinary类型
以节省存储空间,提高效率!
平常我们在进行数据库字段设计
的时候,还是尽量要应根据数据
的实际用途
和存储需求
选择合适的数据类型,充分考虑数据的实际需求和存储效率!
总之我们要明白binary类型
是一种存储固定长度
二进制数据的数据类型,它在存储不需要经常变更的二进制数据时非常有用, 也就是说当我们要存储一些不需要长期被修改的数据时,可以考虑使用binary类型
来提高存储效率!
举个栗子
比如我们要存储一个密码
其实就可以使用binary
假设正在开发一个用户管理系统,并且希望以加密的形式存储用户的密码以提高安全性。
我们可以先使用某种加密算法
来加密用户的密码,例如: md5
, 然后把加密后的密码以二进制形式存储在数据库中
比如说获取用户的原始密码
,并使用选定的加密算法
对其进行加密
。
加密算法会将密码转换为一个无法直接识别原始信息的字符串!
例如:这里我们把一个1213456
用md5
加密得到:aadc03fecca9b5cc2fd64b333cb0875e
然后我们简单的创建一个数据表
CREATE TABLE Users ( UserID INT PRIMARY KEY, Username VARCHAR(50), EncryptedPassword BINARY(50) -- 假设加密后的密码长度固定为50字节
);
这里我简单的建立一个Users表, 里面有三个字段分别为:
UserID(用户ID,主键)、
Username(用户名)、
EncryptedPassword(加密后的密码,使用binary类型存储)
注意
这里我只是假设加密后的密码长度固定为50字节, 在实际开发中,加密后的密码长度
可能会根据所使用的加密算法
和原始密码
的长度而变化!
当用户注册
或更改密码
时,可以将加密后的密码
插入到Users表
的EncryptedPassword
字段中
这里你可以使用相应的语言把这个加密后的字符串转换为十六进制,
例如PHP
可以使用bin2hex()函数
进行转换!
然后使用insert语句 插入到数据库,要使用0x
开头,后面就是加密后密码的十六进制表示!
所以把aadc03fecca9b5cc2fd64b333cb0875e
转换之后为
0x6161646330336665636361396235636332666436346233333363623038373565
把这个插入到数据库中!
例如
INSERT INTO Users (Username, EncryptedPassword)
VALUES ('张三',0x6161646330336665636361396235636332666436346233333363623038373565);
如图
当用户尝试登录时,需要从数据库中查询出该用户的加密的密码,并使用相同的加密算法
对用户输入的密码进行加密
。
然后你可以比较两个加密后的密码是否相同,
比如使用PHP
提取出来之后,使用hexdec函数、hex2bin函数
把十六进制数值、十六进制字符串
进行解析为加密密码,再进行对比,这样来验证用户身份也可以!
如图
需要注意的是,由于这里使用的是固定长度的binary类型,如果加密后的密码长度超过了所指定的长度,则可能需要截断,导致数据丢失!
如果长度小于指定长度,则可能需要填充, 然而,在实际应用中,为了避免这种限制,通常会选择使用varbinary类型
或varbinary(max)类型
来存储加密密码,因为它们可以存储可变长度的二进制数据。
"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚
好玩 好用 好看
的干货教程可以 点击下方关注❤️ 微信公众号❤️ 说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇