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`;
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`;
相关文章推荐
- mysql 权限设置
- MySQL配置简述
- mysql 学习资料
- mysql链接jdbc.URL参数的设置
- 详解MySQL查询缓存
- mysql 每秒钟查询次数、插入次数、删除次数、更新次数的统计
- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
- mysql 5.7.10使用dbforget Studio 连接异常
- MySQL Fabric实验(二)Sharding
- mysql相关日志汇总
- mysql导入固定格式的数据 -- load data
- 查看mysql版本的四种方法
- MySQL 获得当前日期时间 函数
- JDBC连接mysql数据库
- 【虫师--系列】使用JMeter创建数据库(Mysql)测试
- 通过两个经纬度获取他们之间的距离
- mysql安装配置问题相关
- mysql使用in查询,按照期望的顺序输出结果
- MYSQL 5.5 优化思路
- mysql 联合索引