您的位置:首页 > 数据库 > MySQL

mysql bit 总结

2015-12-31 15:02 531 查看
对于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`;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: