数据库建字段,默认值空和empty string有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库建字段,默认值空和empty string有啥区别相关的知识,希望对你有一定的参考价值。

mysql数据库,navicat工具。前提,该字段设置了NOT NULL,所以默认值是没法设为Null的。但是其他两个都可以,而且不影响正常的数据增删改查,也没法插入Null值。
大家看清楚了再回答哦。
我说的不是null和empty string,是“什么都不填”和 empty string的区别。
给个建表语句示例:
add coloum 'name' char(50) not null; 与
add coloum 'name' char(50) default '' not null;
的区别。
另外,无论是否设置default,由于字段本身限制了not null ,所以插入到数据库的值都会变成空字符串。
所以,我问:用“navicat”工具建表,默认值之间的区别。
回答前请先看图片,谢谢。

null=空;empty string=空字符串。可以了解为零字节长度的字符串。另外,要注意一点,就是sql查询的时候要是空的字符串会查询出为空,要是null的话,会提示sql语句有错。那这样的话,好像是数据库校对字符集的问题。

拓展:

1、我们把表中的每一行叫做一个"记录",每一个记录包含这行中的所有信息,就像在通讯录数据库中某个人全部的信息,但记录在数据库中并没有专门的记录名,常常用它所在的行数表示这是第几个记录。在数据库中存放在表行列交叉处的数据叫做"值",它是数据库中最基本的存储单元,它的位置要由这个表中的记录和字段来定义。

2、在数据库中,大多数时,表的"列"称为"字段" ,每个字段包含某一专题的信息。就像"通讯录"数据库中,"姓名"、"联系电话"这些都是表中所有行共有的属性,所以把这些列称为"姓名"字段和"联系电话"字段。但是有时候,字段也不是表中的列,比如用as将列的内容经计算,"存入"另一个字段。如:一个表"T"中只有列"ID",内容为"int"值"1"。运用"select id, id * 5 as abc from T",得出的结果为id abc。

参考技术A Empty String 插入(insert)时,可以不指定列,如果是默认值空会报 Field 'xxx' doesn't have a default value,太深入的我也不知道 参考技术B 差别不是很大,不填存储时占很小很小的空白字节,而empty string存储为0个字节,应该是。 参考技术C mysql学的不精,但null很明显不等于空值。。。null是一个未确定的值,或者说你绝不可能使用一个变量来等于null 参考技术D 首先,要区分开
null=空;
empty string=空字符串。可以了解为零字节长度的字符串。
另外,要注意一点,就是sql查询的时候要是空的字符串会查询出为空,要是null的话,会提示sql语句有错。

那这样的话,好像是数据库校对字符集的问题。。。

使用已填充的模型添加非空和唯一字段

【中文标题】使用已填充的模型添加非空和唯一字段【英文标题】:Add non-null and unique field with already populated model 【发布时间】:2015-03-01 04:57:18 【问题描述】:

我的应用中有一个模型在服务器中运行,其中包含一些条目。我需要为此模型添加一个SlugField,唯一且非空。 SlugField 将基于 trading_name 填充。为了添加这个新字段并修改了保存方法,我更改了模型:

class Supplier(StatusModel):
    SLUG_MAX_LENGTH = 210
    slug = models.SlugField(unique=True, max_length=SLUG_MAX_LENGTH)
    trading_name = models.CharField(max_length=200, verbose_name=_('trading name'))
    ...

    def save(self, *args, **kwargs):
        self.slug = orig = slugify(self.trading_name)[:Supplier.SLUG_MAX_LENGTH]

        for x in itertools.count(1):
            if not Supplier.objects.filter(slug=self.slug).exists():
                break
            # Truncate the original slug dynamically. Minus 1 for the hyphen.
            self.slug = "%s-%d" % (orig[:Supplier.SLUG_MAX_LENGTH - len(str(x)) - 1], x)

        self.full_clean()
        super(Supplier, self).save(*args, **kwargs)

更改模型后,我运行 manage.py makemigrations 并将此迁移作为输出:

class Migration(migrations.Migration):

    dependencies = [
        ('opti', '0003_auto_20141226_1755'),
    ]

    operations = [
        migrations.AddField(
            model_name='supplier',
            name='slug',
            field=models.SlugField(unique=True, default='', max_length=210),
            preserve_default=False,
        ),
    ]

我无法运行manage.py migrate,因为由于唯一的约束,默认值不起作用。

我的问题是:我怎样才能用 Django 1.7 做到这一点?我需要应用架构更改并将当前条目保留在我的数据库中。

【问题讨论】:

发布您创建的迁移,以便我们进行更改 谢谢@FrEaKmAn - 我已经添加了适当的细节:) 【参考方案1】:

不幸的是,我没有找到答案,但我可以创建一个解决方案:

首先我创建了一个允许 slug 字段可以为空的迁移; 然后我创建了另一个迁移,该迁移使用正确的值填充 slug 列到模型中的每一行; 然后是在列中添加非空约束的另一个迁移。

【讨论】:

看来这也是 Django 的建议——docs.djangoproject.com/en/1.9/howto/writing-migrations/… 该链接已损坏。你可以使用docs.djangoproject.com/en/2.2/howto/writing-migrations/…【参考方案2】:

您进行模型更改(添加字段、更改等),然后调用 manage.py makemigrations,然后使用 manage.py migrate 应用迁移

您可以使用null=True 添加字段,然后您例如制作一个脚本来填充它一次

否则,如果您需要在迁移中填充该字段,您可以编写自定义字段,请参阅https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own

【讨论】:

以上是关于数据库建字段,默认值空和empty string有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

小白学习MySQL - TIMESTAMP类型字段非空和默认值属性的影响

automapper如何全局配置map条件过滤null值空值对所有映射起效

如何从数据库中检索非空和非重复数据?

使用已填充的模型添加非空和唯一字段

SwipeRefreshLayout 与 RecyclerView 空和 TextView

王立平--string.Empty