这是MySQL 5实力养成暨评量里的4-30.‘MySQL对于浮点数资料型态,有支援近似值(M,D)的语法,新增一笔资料时,当整数位(小数点左边的位数)超过几位时,MySQL会发生“#1264 – Out of range value adjusted for column”的错误?
答案:(C) M-D
[adsense][/adsense]
这是第十一次模拟测验时唯一真正不知道会错的题目,透过福音悔改的原则,我们可以将MySQL的知识再一次扩大,希望我们不会再错了,各位观众可以参阅MySQL 5.7 Reference Manual :: 11 Data Types :: 11.2 Numeric Types :: 11.2.6 Out-of-Range and Overflow Handling或是简体手册MySQL 5.1参考手册 :: 11. 列类型::11.2. 数值类型。
繁体转译如下:
MySQL支援所有标准SQL数值资料型态。这些型态包括严格数值资料型态(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值资料型态(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT资料型态保存位元值,并且支援MyISAM、MEMORY、InnoDB和BDB资料表。
作为SQL标准的延伸,MySQL也支援整数型态TINYINT、MEDIUMINT和BIGINT。下面的资料表显示了需要的每个整数型态的储存和范围。
| 型态 | 字节 | 最小值 | 最大值 |
| (带符号的/无符号的) | (带符号的/无符号的) | ||
| TINYINT | 1 | -128 | 127 |
| 0 | 255 | ||
| SMALLINT | 2 | -32768 | 32767 |
| 0 | 65535 | ||
| MEDIUMINT | 3 | -8388608 | 8388607 |
| 0 | 16777215 | ||
| INT | 4 | -2147483648 | 2147483647 |
| 0 | 4294967295 | ||
| BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
| 0 | 18446744073709551615 |
MySQL还支援选择在该型态关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的栏位宽度的值时从左侧填满宽度。
显示宽度并不限制可以在栏位内保存的值的范围,也不限制超过栏位的指定宽度的值的显示。
当结合可选延伸属性ZEROFILL使用时, 预设补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的栏位,值4检索为00004。请注意如果在整数栏位保存超过显示宽度的一个值,当MySQL为复杂联接生成临时资料表时会遇到问题,因为在这些情况下MySQL相信资料适合原栏位宽度。
所有整数型态可以有一个可选(非标准)属性UNSIGNED。当您想要在栏位内只允许非负数和该栏位需要较大的上限数值范围时可以使用无符号值。
浮点和定点类型也可以为UNSIGNED。同数类型,该属性防止负值保存到栏位中。然而,与整数类型不同的是,栏位值的上范围保持不变。
如果为一个数值栏位指定ZEROFILL,MySQL自动为该栏位新增UNSIGNED属性。
对于浮点栏位型态,在MySQL中单精度值使用4个字节,双精度值使用8个字节。
FLOAT型态用于资料表示近似数值资料型态。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支援可选的只用于确定储存大小的精度规定。0到23的精度对应FLOAT栏位的4字节单精度。24到53的精度对应DOUBLE栏位的8字节双精度。
MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”资料表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个栏位可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)栏位内插入999.00009,近似结果是999.0001。
MySQL将DOUBLE视为DOUBLE PRECISION(非标准延伸)的同义词。MySQL还将REAL视为DOUBLE PRECISION(非标准延伸)的同义词,除非SQL伺服器模式包括REAL_AS_FLOAT选项。
为了保证最大可能的可移植性,需要使用近似数值资料值储存的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数。
DECIMAL和NUMERIC型态在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:
salary DECIMAL(5,2)
在该例子中,5是精度,2是标度。精度资料表示保存值的主要位数,标度资料表示小数点后面可以保存的位数。
在MySQL 5.1中以二进制格式保存DECIMAL和NUMERIC值。
标准SQL要求salary栏位能够用5位整数位和两位小数保存任何值。因此,在这种情况下可以保存在salary栏位的值的范围是从-999.99到999.99。
在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0)。同样,语法DECIMAL等价于DECIMAL(M,0),可以通过计算确定M的值。在MySQL 5.1中支援DECIMAL和NUMERIC资料型态的变数形式。M预设值是10。
DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或NUMERIC栏位的实际范围受具体栏位的精度或标度约束。如果此类栏位分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与作业系统有关,但一般结果均被截取到允许的位数)。
BIT资料型态可用来保存位元值。BIT(M)型态允许储存M位值。M范围为1到64。
要指定位值,可以使用b’value‘符。value是一个用0和1编写的二进制值。例如,b’111'和b’100000000'分别资料表示7和128。参见9.1.5节,“位元值”。
如果为BIT(M)栏位分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b’101',其效果与分配b’000101'相同。
当要在一个数值栏位内保存一个超出该栏位允许范围的值时,MySQL的操作取决于此时有效的SQL模式。如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。但是,如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。参见5.3.2节,“SQL伺服器模式”。
如果INT栏位是UNSIGNED,栏位范围的大小相同,但其端点会变为到0和4294967295。如果您试图保存-9999999999和9999999999,以非严格模式保存到栏位中的值是0和4294967296。
如果在浮点或定点列中分配的值超过指定(或预设)精度和标度规定的范围,MySQL以非严格模式保存资料表示范围相应端点的值。
当MySQL没有工作在严格模式时,对于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT语句,由于裁剪发生的转换将报告为警告。当MySQL工作在严格模式时,这些语句将失败,并且部分或全部值不会插入或更改,取决于是否资料表为事务资料表和其它因素。详情参见5.3.2节,“SQL伺服器模式”。
这里的错误就是1264的错误,由于中文手册比较没有详述其错误,所以看原文的手册可以比较清楚,请我们一起来牢记这样的题型。

尚無留言
Comments are closed.