1

我表中的条目由 5-10 个字符长的单词唯一标识,我使用 TINYTEXT(10) 作为列。但是,当我尝试将其设置为 PRIMARY 键时,我得到了size缺少的错误。

根据我对文档的有限理解,SizePRIMARY 键可用于简化检测唯一值的方法,即当前几个字符(由 指定Size)足以认为它是唯一匹配时。在我的情况下,size从 5 到 10 不同(它们都是 latin1,因此它们是每个字符的精确字节 + 1 的长度)。两个问题:

  1. 如果我想使用 TINYTEXT 作为 PRIMARY 键,size我应该指定哪个?最大可用 - 在这种情况下为 10?或者应该是size 严格的EXACT,例如,如果我的密钥是 6 个字符长的单词,但我将SizePK 指定为 10 - 它会尝试读取所有 10 个并且会失败并抛出异常?
  2. 使用 [TINY]TEXT 进行 PK 在性能方面有多糟糕?所有的谷歌结果都让我有意见和陈述“这很糟糕,你被解雇了”,但在这种情况下真的是这样吗,考虑到 TINYTEXT 最大为 255 并且我已经将最大长度指定为 10?
4

3 回答 3

4
  1. MySQL/MariaDB 只能索引文本字段的第一个字符,如果太大,则不能索引整个文本。最大密钥大小为 3072 字节,任何大于该大小的文本字段都不能用作 KEY。因此,对于超过 3072 字节的文本字段,您必须明确指定它将索引多少字符。使用 VARCHAR 或 CHAR 时可以直接完成,因为您在声明数据类型时明确设置了它。*TEXT 不是这种情况——他们没有那个选项。解决方案是像这样创建主键:

    CREATE TABLE mytbl (
        name TEXT NOT NULL,
        PRIMARY KEY idx_name(name(255))
    );
    

    如果您需要在大于 3072 字节的 VARCHAR 字段、BINARY 字段和 BLOB 上创建主键,则可以使用相同的技巧。无论如何,您可以想象,如果两个大而不同的文本在开头的前 3072 个字节处以相同的字符开头,那么它们将被系统视为相等。这可能是个问题。

  2. 使用文本字段作为主键通常是个坏主意。有两个原因:

    2.1。与使用整数在表中搜索(WHERE、JOINS 等)相比,它需要更多的处理时间。该链接已旧但仍然相关;

    2.2. 另一个表中的任何外键都必须具有与主键相同的数据类型。当你使用文本时,这会浪费磁盘空间;

注意:*TEXT 和 VARCHAR 的区别在于 *TEXT 字段的内容不存储在表内部,而是存储在外部内存位置。通常,当我们需要存储非常大的文本时,我们会这样做。

于 2020-07-11T20:39:18.190 回答
3

对于 TINYTEXT 不能指定大小。使用 VARCHAR(大小)

SQL 数据类型

于 2020-07-11T20:18:54.310 回答
0

仅供参考,您不能TINYTEXT在 MySQL 中指定大小:

mysql> create table t1 ( t tinytext(10) );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near '(10) )' at line 1

您可以在 之后指定一个长度TEXT,但它不会像您认为的那样工作。这意味着它将选择 TEXT 类型系列中的一种,即至少支持您要求的长度的最小类型。但是一旦这样做,它就不会限制输入的长度。它仍然接受任何数据,直到它选择的类型的最大长度。

mysql> create table t1 ( t text(10) );
Query OK, 0 rows affected (0.02 sec)

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `t` tinytext
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

mysql> insert into t1 set t = repeat('a', 255);
Query OK, 1 row affected (0.01 sec)

mysql> select length(t) from t1;
+-----------+
| length(t) |
+-----------+
|       255 |
+-----------+
于 2020-07-11T21:02:04.070 回答