【问题标题】:Why can't I change my INT from unsigned to signed? Is signed Zerofill possible?为什么我不能将我的 INT 从未签名更改为已签名?可以签名 Zerofill 吗?
【发布时间】:2016-10-24 20:03:18
【问题描述】:

我在名为TEST 的表中有一个名为NUMBER 的字段

NUMBER is int(8) Unsigned Zerofill Not Null

我现在需要在这个字段中输入负数,我仍然希望它们填零 例如-00023419

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

如果我这样做:alter table test modify number int(8) signed zerofill not null - 它保持无符号零填充

如果我这样做:alter table test modify number int(8) zerofill not null - 它保持无符号零填充

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

当我将它设置为有符号时,我输入了一个负数,然后尝试更改为 zerofill,然后数字更改为 00000000,然后一切都再次设置为无符号。不可能对填零的数字签名吗?

【问题讨论】:

  • 你考虑过阅读文档吗?

标签: mysql integer unsigned signed zerofill


【解决方案1】:

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 将其转换为 zerofill 吗?

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

<?php

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

输出:

Number is -0001234

阅读http://php.net/manual/en/function.sprintf.php,了解您可以使用printf()/sprintf() 执行更简洁的格式化操作。

【讨论】:

  • 那么这是否意味着没有人在 mysql 数据库中有负零填充数据?如果是这样,我的下一个问题是,你能用 PHP 将它转换为 zerofill 吗?因此,如果我的数据库在该字段中有 -23419,我需要在我的网页上将其转换为 -00023419。
【解决方案2】:

ZEROFILL 表示未签名。

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

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

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

【讨论】:

    【解决方案3】:

    好吧,如果您的列是外键或主键,MySQL 不允许这种修改发生。您必须事先这样做。

    【讨论】:

    • 不是我的反对意见,但脚本一切皆有可能
    • 哈哈,不用担心!我只是想帮忙,因为它发生在我身上一次
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多