《MySQL技术内幕——SQL编程》读书笔记(二)——数据类型

对数据类型的选择将影响与数据库交互的应用程序的性能。

1、通常来说,如果一个页内可以存放尽可能多的行,那么数据库的性能就越好,因此选择一个正确的数据类型至关重要。

2、另一方面,如果在数据库中创建表时选择了错误的数据类型,那么后期的维护成本可能非常大,用户需要花大量时间进行ALTER TABLE 操作。

1. 数据类型

1. UNSIGNED

将数字类型无符号化。

例如:

INT 的类型范围是 -2147483648 ~ 2147483647

INT UNSIGNED 的 类型范围是 0 ~ 42967295

看起来很不错的属性 ,但会有一些负面作用。

CREATE TABLE t (a INT UNSIGNED,b INT UNSIGNED);
INSERT INTO t SELECT 1,2;
SELECT a - b FROM t;

执行最后一条sql后会报错,如果没有报错得到的结果应该是4 294 967 295。

造成这种结果的原因是:

-1 的 16进制表示是:0xfff fff ff
4 294 967 295 的16进制表示是 : 0xfff fff ff
在MySQL数据库中,对于UNSIGNED数的操作,其返回值都UNSIGNED的。

如果想要得到 - 1 这个值,只要对SQL_MODE这个参数进行设置即可:

SET sql_mode=‘NO_UNSIGNED_SUBTRACTION‘;

尽量不要使用UNSIGNED,INT 类型可能存放不了的数据,INT UNSIGNED 同样可能存放不了,与其如此,还不如在数据库设计阶段将INT类型提升为BIGINT类型。

2、ZEROFILL

像是一个显示的属性。

ALTER TABLE t CHANGE COLUMN a a int(4) UNSIGNED ZEROFILL;

修改了a列后,搜索t表的数据,会出现不一样的显示:

SELECT a,b FROM t\G;
a: 0001
b:2

可以看到a的值由原来的1 变为 0001,这就是ZEROFILL属性的作用,如果宽度小于设定的宽度,则自动填充 0。

注意:

在MySQL中实际存储的还是1。可以用HEX函数检查:

SELECT a,HEX(a) FROM t\G; 

在部分窗口可能看不到,mysql命令行可以看到。

时间: 2024-12-05 23:26:58

《MySQL技术内幕——SQL编程》读书笔记(二)——数据类型的相关文章

MySQL技术内幕(SQL编程)-数据类型

一:MySQL存储引擎 MySQL插件式存储引擎可以让存储引擎层的开发人员设计他们希望的存储层(满足事务需求.满足数据放到内存中等),常见的存储引擎如下: InnoDB存储引擎:支持事务,面向联机事务处理的应用.特点是行锁设计.支持外键.默认读取操作不会产生锁.最为常用的引擎,5.5.8版本后的默认存储引擎. MyISAM:表锁设计.支持全文索引.不支持事务,面向OLAP数据库应用,5.5.8版本前曾是默认存储引擎.其缓冲池只缓存索引文件,不缓存数据文件. NDB:集群存储引擎,结构是share

mysql导入导出sql文件--读书笔记2

window下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql 2.导出一个表mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名mysqldump -u dbuser -p dbname users> dbname_users.sql 3.导出一个数据库结构mysqldump -u dbuser -p -d --add-drop-table

MySQL技术内幕-InnoDB存储引擎-读书笔记(二)

MySQL技术内幕-InnoDB存储引擎-读书笔记(二) 作为php开发,使用mysql总是少不了的 系列文章博客链接 http://itsong.net/articles/466.html 第三章 文件 mysql与innodb几个类型的文件 参数文件,配置路径.初始化参数.内存大小等 日志文件,包括错误日志,二进制日志,慢查询日志,查询日志 socket文件,用unix域套接字,unix domain socket来进行连接时需要的文件,这一般是本机连接,比通常tcp快 pid文件,进程id

MySQL技术内幕-InnoDB存储引擎-读书笔记(一)

MySQL技术内幕-InnoDB存储引擎-读书笔记(一) 作为php开发,使用mysql总是少不了的 博客链接 http://itsong.net/articles/466.html 第一章 MySQL体系结构和存储引擎 MySQL被设计为一个单进程多线程架构的数据库 ./mysql --help | grep my.cnf 可以查看mysql数据库实例启动时,它会在哪些位置查找配置文件. 配置文件中有一个datadir参数,指定了数据库所在的路径.默认为/usr/local/mysql/dat

《大型网站技术架构》读书笔记二:大型网站架构模式

一.分层 最常见的架构模式,将系统在横向维度上切分成几个部分,每个部分单一职责.网站一般分为三个层次:应用层.服务层和数据层,其具体结构如下图所示: 通过分层,一个庞大系统切分成不同部分,便于分工合作和维护. 但是,分层架构也有一些挑战:①必须合理规划层次边界和接口:②禁止跨层次的调用及逆向调用. 二.分割 分割是在纵向方面对软件进行切分->将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,有助于软件开发和维护,还便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力. 三.分布

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

一.mysql架构 mysql是一个单进程多线程架构的数据库. 二.存储引擎 InnoDB: 支持事务 行锁 读操作无锁 4种隔离级别,默认为repeatable 自适应hash索引 每张表的存储都是按主键的顺序记性存放 支持全文索引(InnoDB1.2.x - mysql5.6) 支持MVCC(多版本并发控制)实现高并发 MyISAM: 不支持事务 表锁 支持全文索引 三.InnoDB体系架构 1.后台线程 Master Thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性 IO

mysql技术内幕InnoDB存储引擎-阅读笔记

mysql技术内幕InnoDB存储引擎这本书断断续续看了近10天左右,应该说作者有比较丰富的开发水平,在源码级别上分析的比较透彻.如果结合高可用mysql和高性能mysql来看或许效果会更好,可惜书太厚,还在啃当中,希望能早点读完……. 应该说与oracle相比,mysql数据库还是相对比简单,以后还是深入学习下oracle去. 搞数据库也比搞应用运维相对单纯,不用知道各种应用架构,不用写各种脚本工具,只要掌握这个软件就足够了.当然希望自己的知识还是全面一些好.

代码的未来读书笔记<二>

代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端客户端以及静态动态这2个角度进行了对比. 这四种语言由于不同的设计方针,产生了不同的设计风格. Header 客户端 服务端 动态 Html5 Ruby 静态 Java Go 静态动态 静态:无需实际运行,仅根据程序代码就能确定结果. 动态:只有到了运行时才能确定结果.不过无论任何程序,或多或少都包含的动态的特性. 动态运行模式 运行中的程序能识别自身,并对自身进行操作.对程序自身进行操作的编

Mysql技术内幕——表&amp;索引算法和锁

表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示的定义主键则innodb如按照如下方式选择或者创建主键.首先表中是否有唯一非空索引(unique not null),如果有则该列即为主键.不符合上述条件,innodb存储引擎会自动创建一个6字节大小的指针,rowid(). 4.2.innodb逻辑存储结构 innodb的逻辑存储单元由大到小分别是