数据库中的VARBINARY类型-从正确转换到优化措施的综合指南 (数据库中的VALUES是什么意思)
在数据库中,字符串类型的数据非常常见。虽然char和varchar类型是最常用的字符串类型,但有时候我们需要存储二进制数据,这时候就需要使用varbinary类型。
varbinary类型和char、varchar类型在某些方面是相似的,但是它们之间也存在一些区别。
varbinary、char和varchar类型的比较
特性 | varbinary | char | varchar |
---|---|---|---|
数据类型 | 二进制数据 | 字符数据 | 字符数据 |
取值范围 | 1至8,000 | 1至8,000 | 1至MAX |
最大存储大小 | 2^31-1个字节 | 2^31-1个字节 | 2^31-1个字节 |
从varbinary转换为varchar
在处理varbinary类型的数据时,有时候我们需要将它转换为varchar类型。一种常见的错误方法是使用CAST()或Convert()函数进行转换。但是这种方法转换后的结果可能会出现乱码的情况,因为varbinary类型的数据是二进制数据,而varchar类型的数据是字符数据,它们的编码方式不同。
为了正确地将varbinary类型的数据转换为varchar类型,我们应该使用系统内置的函数sys.fn_VarBinToHexStr()结合hashbytes()函数来获取加密后的数据。
sys.fn_VarBinToHexStr()函数可以将varbinary类型的数据转换为16进制字符串。它的使用方法很简单,只需要将varbinary类型的列或变量作为参数传入即可。这样就可以得到对应的16进制字符串表示。
在使用sys.fn_VarBinToHexStr()函数之前,我们可以先使用hashbytes()函数对varbinary类型的数据进行加密。hashbytes()函数可以将数据转换为哈希值,常用的哈希算法包括MD5、SHA-1和SHA-256等。通过将varbinary类型的数据先进行哈希加密,然后再使用sys.fn_VarBinToHexStr()函数转换为16进制字符串,可以增加数据的安全性和保密性。
使用这种方法进行varbinary类型到varchar类型的转换,可以确保数据的准确性和完整性。同时,16进制字符串的表示形式也更加直观和易于理解。
其他数据类型
除了varbinary类型之外,数据库中还有其他的数据类型,例如binary、nvarchar、text和image等。这些数据类型都有各自的特点和适用范围。在设计数据库表时,我们应该根据具体的业务需求选择合适的数据类型,并合理使用数据库的函数和特性,以提高数据库的性能和可用性。
结论
varbinary类型是一种用于存储二进制数据的数据类型。在需要将varbinary类型的数据转换为varchar类型时,应该使用系统内置的函数sys.fn_VarBinToHexStr()结合hashbytes()函数来获取加密后的数据。通过合理使用数据库的数据类型和函数,可以更好地满足业务需求并保护数据的安全性。
mysql 数据类型的详解
MySQL数据库的表是一个二维表,由一个或多个数据列构成。 每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。 MySQL中的列类型有三种:数值类、字符串类和日期/时间类。 从大类来看列类型和数值类型一样,都是只有三种。 但每种列类型都还可细分。 下面对各种列类型进行详细介绍。 数值类的数据列类型数值型的列类型包括整型和浮点型两大类。 TINYINT:1字节 非常小的正整数,带符号:-128~127,不带符号:0~255 SMALLINT:2字节 小整数,带符号:-~,不带符号:0~ MEDIUMINT:3字节 中等大小的整数,带符号:-~,不带符号:0~ INT:4字节 标准整数,带符号:-~,不带符号:0~ BIGINT:8字节 大整数,带符号:-~,不带符号:0~ FLOAT:4字节 单精度浮点数,最小非零值:+-1.E-38,最大非零值:+-3.E+38 DOUBLE:8字节 双精度浮点数,最小非零值:+-2.E-308,最大非零值:+-1.E+308 DECIMAL:M+2字节 以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。 MYSQL支持大量的列类型,它们可以被分为 3 类:数字类型、日期和时间类型以及字符串(字符)类型。 这个章节首先给出可用类型的概述,并且总结各类型所需的存储需求,然后提供各类型中的类型范畴更详细的描述。 概述有意地简化了。 更详细的说明应该参考特写列类型的附加信息,例如你能为其指定值的允许格式。 MySQL 支持的列类型在下面列出。 下列代码字母用于描述中:M指出最大的显示尺寸。 最大的显示尺寸长度为 255。 D适用于浮点类型。 指出跟随在十进制小数点后的数字数量。 最大可能值为 30,但不应大于M-2。 方括号 (“[”and“]”) 指定可选的类型修饰部份。 注意,如果为一个列指定了ZEROFILL,MySQL 将自动为这个列添加UNSIGNED属性。 警告:你应该知道当在两个整数类型值中使用减法时,如有一个为UNSIGNED类型,那么结果也是无符号的。 查看章节6.3.5 Cast 函数。 TINYINT[(M)] [UNSIGNED] [ZEROFILL]-128到127。 无符号的范围是0到255。 BITBOOL它们是TINYINT(1)的同义词。 SMALLINT[(M)] [UNSIGNED] [ZEROFILL]一个小整数。 有符号的范围是-到。 无符号的范围是0到。 MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]一个中等大小的整数。 有符号的范围是-到。 无符号的范围是0到。 INT[(M)] [UNSIGNED] [ZEROFILL]一个正常大小的整数。 有符号的范围是-到。 无符号的范围是0到。 INTEGER[(M)] [UNSIGNED] [ZEROFILL]INT的同义词。 BIGINT[(M)] [UNSIGNED] [ZEROFILL]一个大的整数。 有符号的范围是-到。 无符号的范围是0到。 你应该知道的有关BIGINT列的一些事情:BIGINT或DOUBLE值来完成的,因此你不应该使用大于(63 bits) 的无符号大整数,除了位函数之外!如果你这样做了,结果中的某些大数字可能会出错,因为将BIGINT转换成DOUBLE时产生了舍入错误。 MySQL 4.0 在下列情况下可以处理BIGINT:在一个BIGINT列中使用整数存储一个大的无符号值。 在MIN(big_int_column)和MAX(big_int_column)中。 当两个操作数都是整数时使用操作符 (+、-、*、等)。 通常你可以在一个BIGINT列中以字符串方式存储的一个精确的整数。 在这种情况下,MySQL 将执行一个字符串到数字的转换,包括无 intermediate 的双精度表示法。 当两个参数均是整数值时,“-”、“+”和“*”将使用BIGINT运算!这就意味着,如果两个大整数的乘积(或函数的结果返回整数)的结果大于时,你可能会得到意想不到的结果。 FLOAT(precision) [UNSIGNED] [ZEROFILL]一个浮点型数字。 precision可以是<=24作为一个单精度的浮点数字和介于 25 和 53 之间作为一个双精度的浮点数字。 这些类型与下面描述的FLOAT和DOUBLE类型相似。 FLOAT(X)有与相应的FLOAT和DOUBLE类型同样的范围,但是显示尺寸和十进制小数位数是未定义的。 在 MySQL 3.23 中,它是一个真实的浮点值。 而在 MySQL 早期的版本中,FLOAT(precision)通常有 2 小数位。 注意,由于在 MySQL 中所有的计算都是以双精度执行的,所以使用FLOAT可能带来一些意想不到的问题。 查看章节A.5.6 解决没有匹配行的问题。 FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]一个小的(单精度) 浮点数字。 允许的值是-3.E+38到-1.E-38、0和1.E-38到3.E+38。 如果UNSIGNED被指定,负值是不允许的。 M是显示宽度,D是小数位数。 FLOAT没有参数或有X<= 24 的FLOAT(X)代表一个单精度的浮点数字。 DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]一个正常大小的(双精度)浮上数字。 允许的值是-1.E+308到-2.E-308、0和2.E-308到1.E+308。 如果UNSIGNED被指定,负值是不允许的。 M是显示宽度,D是小数位数。 DOUBLE没胡参数或有 25 <=X<= 53 的FLOAT(X)代表一个双精度的浮点数字。 DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]REAL[(M,D)] [UNSIGNED] [ZEROFILL]它们是DOUBLE同义词。 DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]一个未压缩(unpacked)的浮点数。 运作如同一个CHAR列:“unpacked” 意味着数字是以一个字符串存储的,值的每一位将使用一个字符。 小数点并且对于负数,“-”符号不在M中计算(但是它们的空间是被保留的)。 如果D是 0,值将没有小数点或小数部份。 DECIMAL值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL列,实际的范围可以被所选择的M和D限制。 如果UNSIGNED被指定,负值是不允许的。 如果D被忽略,缺省为 0。 如果M被忽略,缺省为 10。 在 MySQL 3.23 以前,M参数必须包含符号与小数点所需的空间。 DEC[(M[,D])] [UNSIGNED] [ZEROFILL]NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]DECIMAL的同义词。 DATE一个日期。 支持的范围是1000-01-01到9999-12-31。 MySQL 以YYYY-MM-DD格式显示DATE值,但是允许你以字符串或数字给一个DATE列赋值。 查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。 DATETIME一个日期和时间的组合。 支持的范围是1000-01-01 00:00:00到9999-12-31 23:59:59。 MySQL 以YYYY-MM-DD HH:MM:SS格式显示DATETIME值,但是允许你以字符串或数字给一个DATETIME列赋值。 查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。 TIMESTAMP[(M)]一个时间戳。 范围是1970-01-01 00:00:00到2037年间的任意时刻。 MySQL 4.0 和更早版本中,TIMESTAMP值是以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式显示的,它取决于M是否是14(或省略)、12、8或6,但是允许你以字符串或数字给一个TIMESTAMP列赋值。 从 MySQL 4.1 开始,TIMESTAMP以YYYY-MM-DD HH:MM:DD格式作为字符返回。 如果你你希望以数字形式返回则必须在该时间戳字段后加上 +0。 不同的时间戳长度是不支持的。 从 MySQL 4.0.12 开始,选项--new可以被用来使服务器与 4.1 一样运作。 TIMESTAMP列有益于记录一个INSERT或UPDATE操作的日期和时间,因为如果你自己没有给它赋值,它将被自动地设置为最近一次操作的日期和时间。 也可以通过给它赋一个NULL而使它设置为当前的日期和时间。 查看章节6.2.2 Date 和 Time 类型。 参数M只影响一个TIMESTAMP列的显示格式;它的值总是占用 4 个字节存储。 注意,当TIMESTAMP(M)列的M是 8 或 14 时,它返回的是数字而其它的TIMESTAMP(M)列返回的是字符串。 这仅仅是为了可以可靠地转储并恢复到其它格式的表中。 查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。 TIME一个时间。 范围是-838:59:59到838:59:59。 MySQL 以HH:MM:SS格式显示TIME值,但是允许你使用字符串或数字来给TIME列赋值。 查看章节6.2.2.3TIME类型。 YEAR[(2|4)]一个 2 或 4 位数字格式的年(缺省为 4 位)。 允许的值是1901到2155、0000(4 位年格式) 以及使用 2 位格式的 1970-2069 (70-69)。 MySQL 以YYYY格式显示YEAR值,但是允许你使用字符串或数字来给YEAR列赋值。 (YEAR类型在 MySQL 3.22 之前不支持。 ) 查看章节6.2.2.4YEAR类型。 [NATIONAL] CHAR(M) [BINARY]一个定长的字符串,当存储时,总是以空格填满右边到指定的长度。 M的范围是 0 到 255 (在 MySQL 3.23 版本之前为 1 到 255)。 当该值被检索时,尾部空格将被删除。 CHAR值根据缺省的字符集进行忽略大小写的排索与比较,除非指定了关键词BINARY。 NATIONAL CHAR(或短形式NCHAR) 是以 ANSI SQL 方式定义一个CHAR列,它将使用缺省的字符集。 这在 MySQL 中是默认的。 CHAR是CHARACTER的缩写。 MySQL 允许以CHAR(0)类型建立一个列。 一些老程序运行时必需一个列,却又并不使用这个列的值,你就不得不为了适应它而建立该列,在这情况下,CHAR(0)将是很有益的。 当需要一个列仅保存两个值时:一个为CHAR(0)(该列没有定义为NOT NULL),这将仅占用一个比特位来存储 2 个值:NULL或。 查看章节6.2.3.1CHAR和VARCHAR类型。 CHAR这是CHAR(1)的同义词。 [NATIONAL] VARCHAR(M) [BINARY]一个变长的字符串。 注意:尾部的空格在存储时将会被删除(这与 ANSI SQL 约规不同)。 M的范围是 0 到 255 (在 MySQL 4.0.2 之前的版本中是 1 到 255)。 VARCHAR值以大小写忽略方式进行排索与比较,除非关键词BINARY被指定。 查看章节6.5.3.1 隐式的列定义变化。 VARCHAR是CHARACTER VARYING的缩写。 查看章节6.2.3.1CHAR和VARCHAR类型。 TINYBLOBTINYTEXT一个BLOB或TEXT列,最大长度为 255 (2^8 - 1) 个字符。 查看章节6.5.3.1 隐式的列定义变化。 查看章节6.2.3.2BLOB和TEXT类型。 BLOBTEXT一个BLOB或TEXT列,最大长度为 (2^16 - 1) 个字符。 查看章节6.5.3.1 隐式的列定义变化。 查看章节6.2.3.2BLOB和TEXT类型。 MEDIUMBLOBMEDIUMTEXT一个BLOB或TEXT列,最大长度为 (2^24 - 1) 个字符。 查看章节6.5.3.1 隐式的列定义变化。 查看章节6.2.3.2BLOB和TEXT类型。 LONGBLOBLONGTEXT一个BLOB或TEXT列,最大长度为 (2^32 - 1) 个字符。 查看章节6.5.3.1 隐式的列定义变化。 注意,由于服务器/客户端的协议以及 MyISAM 表通常有一个 16M 每通信包/表行的限制,你仍然不能使用这个类型的整个范围。 查看章节6.2.3.2BLOB和TEXT类型。 ENUM(value1,value2,...)一个枚举类型。 一个仅能有一个值的字符串对象,这个值选自值列value1、value2、...、NULL或特殊的出错值。 一个ENUM列可以有最大 不同的值。 查看章节6.2.3.3ENUM类型。 SET(value1,value2,...)一个集合。 一个能有零个或更多个值的字符串对象,其中每个值必须选自值列value1、value2、...。 一个SET列可以有最大 64 个成员。 查看章节6.2.3.4SET类型。 MySQL 支持所有的 ANSI/ISO SQL92 数字类型。 这些类型包括准确数字的数据类型(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包括近似数字的数据类型(FLOAT、REAL和DOUBLE PRECISION)。 关键词INT是INTEGER的同义词,关键词DEC是DECIMAL的同义词。 NUMERIC和DECIMAL类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。 他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。 当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;例如:salary DECIMAL(5,2)在这个例子中,5(精度(precision)) 代表重要的十进制数字的数目,2(数据范围(scale)) 代表在小数点后的数字位数。 在这种情况下,因此,salary列可以存储的值范围是从-99.99到99.99。 (实际上 MySQL 在这个列中可以存储的数值可以一直到999.99,因为它没有存储正数的符号)。 译者注:M 与D 对DECIMAL(M, D) 取值范围的影响类型说明 取值范围(MySQL < 3.23) 取值范围(MySQL >= 3.23)DECIMAL(4, 1) -9.9 到 99.9 -999.9 到 9999.9DECIMAL(5, 1) -99.9 到 999.9 -9999.9 到 .9DECIMAL(6, 1) -999.9 到 9999.9 -.9 到 .9DECIMAL(6, 2) -99.99 到 999.99 -9999.99 到 .99DECIMAL(6, 3) -9.999 到 99.999 -999.999 到 9999.999# 在MySQL 3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于早期版本中的DECIMAL(M + 2, D) 的取值范围。 注释结束:在 ANSI/ISO SQL92 中,句法DECIMAL(p)等价于DECIMAL(p,0)。 同样的,在执行被允许决定值p的地方,句法DECIMAL等价于DECIMAL(p,0)。 MySQL 目前还不支持DECIMAL/NUMERIC数据类型的这些变体形式中的任一种。 一般来说这并不是一个严重的问题,通过明确地控制精度和数值范围可以得到这些类型的主要功能益处。 DECIMAL和NUMERIC值是作为字符串存储的,而不是作为二进制浮点数,以便保护这些值的十进制精确度。 一个字符用于数值的每一位、小数点(如果scale> 0) 和“-”符号(对于负值)。 如果scale是 0,DECIMAL和NUMERIC值不包含小数点或小数部分。 DECIMAL和NUMERIC值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL或NUMERIC列,它的实际范围可制定该列时的precision或scale限制。 当这样的列被赋给了小数点的位数超过scale所指定的值时,该将根据scale进行四舍五入。 当一个DECIMAL或NUMERIC列被赋与一个大小超过指定(或缺省)的precisionandscale的限止范围时,MySQL 以该列范围的端点值存储该值。
从数据类型 varchar 转换为 numeric 时出错.怎么解决
首先这个问题涉及到ADO编程。 既然你使用了TADOQUERY控件。 说明你应该对这方面有一些了解了。 下面我会和你说下调试的方法和问题出现的原因以及解决方案。 1.调试当你在;这句设置断点,即鼠标停留在该行,按下F5。 右击选择菜单Debug-Evaluate/Modify弹出对话框,在Expression输入按下回车Result将显示该数据的内容。 你将得到一条完整的数据库操作语句。 复制该SQL语句,到查询分析器或者PL/SQL中执行。 将得到错误原因。 2. 原因由于你的插入语句使用的是含有引号的值,根据标准SQL语法,理解为字符数组。 而你数据库中的表字段是数字类型的。 由于数据类型不相符。 数据库报错。 错误原因即你题目中写到的。 3.解决方案将SQL语句修改一下,或者修改数据库中的表字段结构。 (一般情况表结构不会轻易变动,除非是设计时不合理)4.优化关于SQL的优化方案有很多类型。 例如你题目中的写法,运行时准确性可以保证,但是效率可以提高。 比如将sql的拼写使用绑定变量方式。 如果批量使用该语句时,可以多条一起提交。 优化的原理是利用数据库自带的缓存,提高效率。 另外,表在设计时竟可能不要使用中文。 控件名称多使用一些有意义的变量名。 比如InsertQuery,Date,Account.祝你在使用中得到更快的技术提升。 同时代码有很好的可读性。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。