为什么我不能将我的INT从unsigned更改为signed?是否可以签署Zerofill?

时间:2016-10-24 20:03:19

标签: mysql integer unsigned signed zerofill

我在名为NUMBER

的表格中有一个名为TEST的字段
NUMBER is int(8) Unsigned Zerofill Not Null

我现在需要这个领域的负数,我仍然喜欢他们zerofilled 例如-00023419

我可以将其更改为已签名,但似乎无法获得零填充。

如果我这样做:alter table test modify number int(8) signed zerofill not null - 它保持未签名的zerofill

如果我这样做:alter table test modify number int(8) zerofill not null -   它保持未签名的zerofill

如果我这样做:alter table test modify number int(8) signed not null - 我签了名但没有zerofill

当我设置为签名时,我输入一个负数,然后尝试更改为zerofill,数字更改为00000000,所有内容都再次设置为无符号。签署零填充号码是不可能的吗?

3 个答案:

答案 0 :(得分:3)

https://dev.mysql.com/doc/refman/5.7/en/numeric-type-attributes.html说:

  

如果为数字列指定ZEROFILL,MySQL会自动将UNSIGNED属性添加到列中。

在2006年报告为错误,关闭为"不是错误"。 https://bugs.mysql.com/bug.php?id=24356

重新评论:

  

这是否意味着没有人在mysql数据库中有负零填充数据?

右。 ZEROFILL最常见的用例是确保邮政编码或银行帐号等内容使用固定位数。这些案例无论如何都不支持负值,所以为什么要用像-00001234这样丑陋的字符串呢?

  

你可以用PHP将其转换为零填充吗?

是的,您可以在PHP中使用零填充格式化数字。

<?php

$n = -1234;
printf("Number is %08d\n", $n);

输出:

Number is -0001234

阅读http://php.net/manual/en/function.sprintf.php,了解使用printf() / sprintf()进行的更整洁的格式设置。

答案 1 :(得分:1)

ZEROFILL暗示UNSIGNED。

MySQL参考手册https://dev.mysql.com/doc/refman/5.7/en/numeric-type-attributes.html

  

如果为数字列指定ZEROFILL,MySQL会自动将UNSIGNED属性添加到列中。

考虑到所有潜在问题,我避免使用非标准的MySQL ZEROFILL属性。

答案 2 :(得分:-1)

好吧,如果您的列是外键或主键,MySQL不允许进行此修改。你必须事先做到这一点。