当我们在MySQL中创建一个VARCHAR列的表时,我们必须为它设置长度.但对于TEXT型,我们不需要提供长度.

VARCHARTEXT之间有什么区别?

推荐答案

TL;博士

100

  • 修正了65535个字符的最大大小(不能限制最大大小)
  • 占用2+c字节的磁盘空间,其中c是存储字符串的长度.
  • 不能(完全)成为索引的一部分.需要指定前缀长度.

100

  • 变量最大大小为M个字符
  • M必须介于1和65535之间
  • takes 1 + c bytes (for M ≤ 255) or 2 + c (for 256 ≤ M ≤ 65535) bytes of disk space where c is the length of the stored string
  • 可以是索引的一部分

更多细节

TEXT has a fixed max size of 2¹⁶-1 = 65535 characters.
VARCHAR has a variable max size M up to M = 2¹⁶-1.
So you cannot choose the size of TEXT but you can for a VARCHAR.

另一个区别是,不能在TEXT列上放置索引(全文索引除外)

但是,如果您知道可能输入字符串的最大长度只有M,例如电话号码、姓名或类似的内容,那么您也希望使用VARCHAR.然后,你可以使用VARCHAR(30)而不是TINYTEXTTEXT,如果有人试图在你的电话号码栏中保存所有三本《指环王》的文本,你只存储前30个字符:)

Edit:如果要存储在数据库中的文本长度超过65535个字符,则必须 Select MEDIUMTEXTLONGTEXT,但要小心:MEDIUMTEXT存储最多16MB的字符串,LONGTEXT存储最多4GB的字符串.如果使用LONGTEXT并通过PHP获取数据(至少如果使用mysqli而不使用store_result),可能会出现内存分配错误,因为PHP试图分配4GB内存,以确保整个字符串都可以缓冲.这可能在PHP以外的其他语言中也会发生.

但是,您应该判断输入(是否太长?是否包含奇怪的代码?)before将其存储在数据库中.

Notice: For both types, the required disk space depends only on the length of the stored string and not on the maximum length.
E.g. if you use the charset latin1 and store the text "Test" in VARCHAR(30), VARCHAR(100) and TINYTEXT, it always requires 5 bytes (1 byte to store the length of the string and 1 byte for each character). If you store the same text in a VARCHAR(2000) or a TEXT column, it would also require the same space, but, in this case, it would be 6 bytes (2 bytes to store the string length and 1 byte for each character).

有关更多信息,请查看documentation.

最后,我想补充一点,TEXTVARCHAR都是可变长度的数据类型,因此它们很可能会最小化存储数据所需的空间.但这需要在性能上进行权衡.如果需要更好的性能,必须使用固定长度的类型,如CHAR.你可以阅读更多关于这here的信息.

Mysql相关问答推荐

带负数的MySQL子字符串_索引

在MySQL中存储一条帖子的点赞数量

根据当前表列的值,从SQL中的另一个表中获取数据

从insert语句获取新生成的虚拟UUID

为大表优化 Django 模型

如何在Pandas 中使用 to_sql

MySQL 将分组 JSON Select 转换为单个 JSON 对象

使用数据表的直方图(SQL 查询)

如何在任何连续范围内获得最大值

mysql - 如何加入表中的动态列

FreeBASIC 中的 MySQL 访问读取

如何按给定开始日期和结束日期的月份汇总?

如何将时刻 JS 时间插入 MySQL

仅在 MYSQL DATEDIFF 中显示小时数

MySQL 在每个唯一值第一次出现时 Select 行

MySQL 实用程序 - ~/.my.cnf 选项文件

使用 Docker 我收到错误:SQLSTATE[HY000] [2002] 没有这样的文件或目录

为什么 GRANT 在 MySQL 中不起作用?

匹配 IN 子句中的所有值

cron 启动的 mysqldump 和密码安全