mysql bit 总结

来源:互联网 发布:网络舆情监测专业介绍 编辑:程序博客网 时间:2024/06/16 02:44

对于mysql 表里常用的 bit(1) 类型的列,有如下常用的插入方式。 现在就mysql 理解values ( ... ) 中的数据的几种方式总结如下 :


1、外层不套单引号的整数数据,如 values (1)  : 这种数值不包含类型信息,只要其实际值不超过列类型的表达范围,就可以成功插入。 但若超过了列类型的表达范围,就会报 data too long  。如: 

insert into temp values(1,127,3); #ok

insert into temp values(2,127,3); #no  Data too long for column 'bTest' at row 1


2、对于mysql 中特殊的常量 - true 和 false , 

①、直接使用 : true / false   ,相当于 1 / 0 ,故行为和 1 中相同

②、使用 'true' / 'false' ,相当于两个字符串,和整型无关,不能插入到整型类型的列中


3、外层单引号的整数数据 ,且最左边不加 b ,如  values(' 1 ') : 这种表达方式的整数常量数据,插入到bit 型列的时候,会将其转换为 这个单常量字符,对应的ascii 值,如果此值超过了对应bit型列所表达的数值,则会报 Data too long ,否则不会报错。   

# 需要注意的是: 

                                  I、这种方式,即使插入成功,存储的也是字符二进制的值,如  '1' : 对应的是49

 II、如 bit(8) 表示的是 0-255 ,而不是-128 - 127 ,内部存储的是无符号类型整数

对于bit型的列,非常忌讳按照这种方式来插入数据,如果插入报错了还好,如果插入成功了, 绝大部分可能内部是按照错误的方式存储的,除非先手动转了ascii码,如下所示 ,插入 '1'  实际上是 '49' 

4、插入一句题外话,对于 '数值' 这样写法的数据,插入其他的整形列中,如 tinyint、smallint等,和不带单引号是等价的,系统会判断其值是否超过了对应列所表示的数据范围,而忽略其类型信息。即只要范围不超标,则可以插入到  tinyint、smallint、mediumint、int、bigint 这些所有的整数类型中。


5、使用【b ' 二进制数据 ' 】这种方式, 是二进制整形常量,这种二进制的整形常量,存储到bit 类型列的时候,也是按照二进制字面数值来存储的,而不是按照ascii的值,非常好用,但是,需要注意的是:

①、数据不能超过列类型表达的范围,如把 b'11'存入到 bit(1) 中,就会包data too long 

②、b' ' ,这个单引号中间的部分,只能出现 0 或者 1,若出现了其他数据,如2 等,则会报语句解析错误。


部分测试代码如下: 

drop table if exists `temp`;
CREATE TABLE if not exists `temp` (
  `bTest` bit(1) NOT NULL,
  `tiTest` TINYINT NOT NULL,
  `blTest` tinyint(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#下面是插入成功的数据
delete from temp;
insert into temp values(1,127,3);    #ok
insert into temp values(b'1',127,3); #ok
insert into temp values(true,127,3); #ok
#下面是插入出错的数据
insert into temp values(2,127,3);    #no  Data too long for column 'bTest' at row 1
insert into temp values('1',127,3);    #no  Data too long for column 'bTest' at row 1
insert into temp values(b'2',127,3);     #no  You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'b'2',127,3)' at line 4
insert into temp values('11',127,3);    #no  Data too long for column 'bTest' at row 1
insert into temp values('true',127,3);   #no  Data too long for column 'bTest' at row 1
select * from `temp`;


0 0