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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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命令行可以看到。









以上是关于《MySQL技术内幕——SQL编程》读书笔记——数据类型的主要内容,如果未能解决你的问题,请参考以下文章

《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

《MySQL技术内幕InnoDB存储引擎》读书笔记 第一章

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

《深入分析JavaWeb技术内幕》读书笔记——中文编码

spring技术内幕读书笔记之IoC容器的学习