mysql为什么没有nvarchar,关于mysql:为什么不将每个VARCHAR指定为VARCHAR(65535)?

由于Varchar字段的存储要求基于输入的字符串的实际长度,因此将每个Varchar字段指定为最大可能值的缺点是什么:Varchar(65535)? 好吧,除了1个额外的字节以外,最大字段数> 255个字符?

[长度为L的字符串的存储要求:如果列值需要0 – 255字节,则L + 1字节;如果值可能需要255个以上字节,则L + 2字节]

谢谢!

如果不是相同的问题,请联系:stackoverflow.com/questions/262238/

感谢大家的意见! 我是stackoverflow的新手,并真诚地感谢每个人的响应能力。 :-)

从文档-表的列数和行大小限制:

Every table (regardless of storage engine) has a maximum row size of 65,535 bytes. Storage engines may place additional constraints on this limit, reducing the effective maximum row size.

The maximum row size constrains the number (and possibly size) of columns because the total length of all columns cannot exceed this size. For example, utf8 characters require up to three bytes per character, so for a CHAR(255) CHARACTER SET utf8 column, the server must allocate 255 × 3 = 765 bytes per value. Consequently, a table cannot contain more than 65,535 / 765 = 85 such columns.

Storage for variable-length columns includes length bytes, which are assessed against the row size. For example, a VARCHAR(255) CHARACTER SET utf8 column takes two bytes to store the length of the value, so each value can take up to 767 bytes.

因此,定义单个VARCHAR(65535)列可以有效地将您限制为该行中的单个列(假设您已将其填满)。

所有这些,除了对于某些类型的数据来说都是如此大的事实是完全错误的-如果您的电话号码列可能包含本地和国际号码,则可以选择使用VARCHAR字段来执行此操作,但是将其设置为20以上可能毫无意义(我很慷慨)。

请参见Bill Karwin的答案,该答案还指出如果使用不必要的长VARCHAR字段生成临时表可能会导致性能下降(与将此类字段转换为CHAR并再次转换-有关详细信息,请参见该帖子)。

但是,除了VARCHAR(65535)列(称为data1)之外,我的表确实还有其他列。 所有这些列都使用输入的数据进行填充,因为没有data1列实际上包含接近最大大小的字符串。

@tgoneil-尝试在该列中插入65535个字符,并在其他列中插入数据。

我同意您的警告(假设您已填写),并理解这一点。 就我而言,可能永远不会在该字段中插入大小为65535的实际字符串,因此从一开始就绝不是问题。 似乎限制VARCHAR大小的唯一真实原因是,如果尝试超过预期的最大大小,则强制执行错误。

@tgoneil-这本身就是一个很好的理由。

请注意,TEXT和BLOB类型的列不计入此MySQL行大小限制(我以前曾以为VARCHAR也是如此,但我错了)

我认为VARCHAR列长度不仅与存储有关。它们也与数据语义有关。

即将name列指定为varchar(100)表示存储在系统中的名称不得超过100个字符。

在存储方面,它们应该是相同的。虽然,行大小估计在VARCHAR列上具有特定长度的情况下会更准确,而在没有行长度估计的情况下(不需要统计收集系统将数据分布保持在VARCHAR大小上)。

一种可能的原因是改善与其他应用程序的兼容性。例如,如果您有一个使用" product_no"字段长度为100个字符的应用程序,而您想与一个使用类似" model_no"字段类似长度为40个字符的应用程序进行交互,那将很痛苦。应用程序中任何超过40个字符的product_nos都将被截断,您必须找出某种方法在应用程序之间进行转换。

例如,MySQL中的MEMORY引擎不能很好地支持VARCHAR-Fields。引擎将为每一行保留最大字节数,而不是实际使用的长度。因此,如果您定义一个具有单个VARCHAR(1000)列的表,则添加的每一行的内存使用量将为1000 * 3字节,即使它们是空字符串也是如此。

原因之一是该字段的大小是对输入数据的检查。您是否真的要有人输入1000个字符的电话号码?字段太大是确保垃圾将输入到数据库中的一种方法。您的电话号码上会显示类似的内容(例如,不是随机产生的):

"只和前台的大金发女郎说话"

而不是真实的电话号码或电子邮件字段,其中包含有关客户的注释,因为他们没有注释字段?当您尝试向其发送电子邮件时,效果并不理想。

宽表可能会在数据库中产生所有问题,因为您可能会遇到意外的记录限制(您可以将表设计为比实际存储在一个记录中更宽的表,有时这会导致插入意外失败)和作为数据的性能问题跨数据页分隔。我知道您可以从SQL Server的宽表中获得该信息,如果mysql遇到类似问题,我也不会感到惊讶。 mysql专家将不得不真正解决这个问题。索引也可能是广泛领域的问题。数据库引擎可能不太倾向于认为索引是有用的。同样,我不确定mysql是否会出现此问题,但这值得研究。我知道这些是在SQL Server中使用所有字段的最大字段大小的问题,mysql可能有这些问题或其他SQL Server没有的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值