- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
由于 Varchar 字段的存储要求基于输入的字符串的实际长度,将每个 Varchar 字段指定为最大可能的缺点是什么:Varchar (65535)?那么,除了最大字段 > 255 个字符的 1 个额外字节之外?
[长度为 L 的字符串的存储请求:如果列值需要 0 – 255 个字节,则 L + 1 个字节,如果值可能需要超过 255 个字节,则 L + 2 个字节]
谢谢!
最佳答案
来自 documents - 表列数和行大小限制:
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 可能毫无意义(我很慷慨)。
见 this answer来自 Bill Karwin,这也表明如果使用不必要的长 VARCHAR
字段生成临时表(与将这些字段转换为 CHAR
并再次返回有关),则可能会降低性能 - 请参阅帖子详情)。
关于mysql - 为什么不将每个 VARCHAR 都指定为 VARCHAR (65535)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7653007/
我是一名优秀的程序员,十分优秀!