【发布时间】:2011-05-02 14:49:44
【问题描述】:
一直以为括号里的数字代表字段长度?
但是,我知道情况并非总是如此。也许这是一个MySQL问题?有人告诉我,如果我将字段设置为 9 个字符长,我可以添加一个超过 9 个字符的值,但只会保存前 9 个字符。
例子:
CREATE TABLE `person` (
id INT,
age INT(2)
);
如果是这种情况,我不应该选择 TINYINT 而不是 INT 作为年龄吗?
【问题讨论】:
一直以为括号里的数字代表字段长度?
但是,我知道情况并非总是如此。也许这是一个MySQL问题?有人告诉我,如果我将字段设置为 9 个字符长,我可以添加一个超过 9 个字符的值,但只会保存前 9 个字符。
例子:
CREATE TABLE `person` (
id INT,
age INT(2)
);
如果是这种情况,我不应该选择 TINYINT 而不是 INT 作为年龄吗?
【问题讨论】:
INT(2) 将生成一个带有 minimum display width of 2 的 INT:
MySQL 支持扩展,用于在类型的 base 关键字后面的括号中可选地指定整数数据类型的显示宽度。例如,INT(4) 指定显示宽度为四位的 INT。应用程序可以使用这个可选的显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格向左填充它们。 (也就是说,这个宽度存在于结果集返回的元数据中。是否使用取决于应用程序。)
显示宽度不限制可以存储在列中的值的范围。它也不会阻止正确显示比列显示宽度更宽的值。例如,指定为 SMALLINT(3) 的列的 SMALLINT 范围通常为 -32768 到 32767,超出三位数允许范围的值将使用多于三位数完整显示。
这不会影响可以存储在字段中的可能值的范围;它也不是用于存储它的字节数。除非使用ZEROFILL,否则似乎只是对应用程序如何显示值的建议(请参阅链接页面)。
一个未签名的TINYINT (0...255) 可能也可以,除非cryopreservation 在您的应用程序的生命周期中向前迈出了一大步。
【讨论】:
varchar,它是一个值可以采用的实际最大宽度。
对于像 vchar 这样的字段类型就是这种情况,但对于数字,它表示它用来表示数字的字节数。两个字节的整数意味着您可以保存一个数字 2^16 - 1(一个字节中有 8 位,因此总共 16 个)。如果它的年龄,我认为你应该是安全的两个字节。 ;)
【讨论】:
(2)也代表字节,但它是不正确的。
ssn INT(9)