【问题标题】:Django in-memory database model creation failureDjango内存数据库模型创建失败
【发布时间】:2015-08-27 13:19:21
【问题描述】:

我正在使用 MariaDB MEMORY 引擎。我在my.cnf中定义了max_heap_table_size,重启了数据库服务。现在,我运行迁移并得到:

django.db.utils.ProgrammingError: Storage engine MEMORY doesn't support BLOB/TEXT columns

我的错误模型是:

class Department(models.Model):
    name = models.CharField(max_length=100)
    tag = models.CharField(max_length=10)
    dtype = models.PositiveSmallIntegerField()
    info = models.CharField(max_length=64000)

虽然,最大 VARCHAR 是 65535。有什么问题?

【问题讨论】:

    标签: python mysql django mariadb


    【解决方案1】:

    正如文档所说的here65.535 实际上是字节,如果使用UTF-8,则最多有 21.844 个字符。

    可变长度字符串。 M 表示最大列长度 人物。 M 的范围是 0 到 65,535。有效最大值 VARCHAR 的长度取决于最大行大小(65,535 字节, 它在所有列之间共享)和使用的字符集。为了 例如,utf8 字符每个字符最多需要三个字节, 因此可以声明使用 utf8 字符集的 VARCHAR 列 最多为 21,844 个字符。

    由于 Django 模型中 CharFieldmax_length 指定字符而不是字节的长度,我认为这是导致错误的原因。

    【讨论】:

    • 那么,在内存中存储 30-40k 个 unicode 符号的最佳选择是什么?
    • @ka2m 我真的不知道。考虑到MariaDB,这似乎是一个硬限制。如果有一个高性能且仍然方便的解决方法,这是个好问题。根据用例,可能将一些任务传递给Redis 之类的东西也可能有效,但这当然完全取决于用例。
    • 请解释“30-40k unicode 符号”是什么意思。一根长绳子?
    【解决方案2】:

    将表设为 MyISAM 或 InnoDB。任何一个都会快速缓存您的字符串,从而使响应就好像它在“内存中”一样。

    至于令人困惑的错误消息 - 需要超过 64K 字节VARCHAR 被默默地转换为 MEDIUMTEXT

    如果您的字符串可以分成多个部分,则可以有多个行。 (有一个带有某种行号的第二列。)

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2014-04-09
      • 2015-10-01
      • 2012-04-20
      • 2022-11-23
      • 1970-01-01
      相关资源
      最近更新 更多