我了解到 VARCHAR 占用了唯一需要的内存,而 CHAR 则无论是否需要,它总是占用相同数量的内存。
我的问题:假设我有一个字段 VARCHAR(50),我知道如果它需要存储 30 个字符,它只会占用 30 个字节并且不会超过(假设 1 个字符占用一个字节)。那么为什么我还要提到 50 或 30 或任何上限,因为它只会占用所需的内存。
更新:为什么我必须提到上限,因为不会占用无用的内存?
我了解到 VARCHAR 占用了唯一需要的内存,而 CHAR 则无论是否需要,它总是占用相同数量的内存。
我的问题:假设我有一个字段 VARCHAR(50),我知道如果它需要存储 30 个字符,它只会占用 30 个字节并且不会超过(假设 1 个字符占用一个字节)。那么为什么我还要提到 50 或 30 或任何上限,因为它只会占用所需的内存。
更新:为什么我必须提到上限,因为不会占用无用的内存?
你不会的。你会成功VARCHAR(30)
的。这大约是允许的最大字符数。那么,为什么还要让一个包含 30 个字符的列接受最多 50 个字符呢?
更新:为什么我必须提到上限,因为不会占用无用的内存?
如果您使用类似的东西来清理您的输入,final_value = left(provided_value, 30)
那么这对您的数据库来说不是问题。varchar(255)
如果您愿意,可以将其设置为。
设置最大限制的想法是确保您不会错误地发送比实际计划更多的字符。
将来代码维护调用每个表的每一列的数据大小限制将是一个痛苦。无论如何,您都需要这样做,但是将您的表定义视为有关该信息的单一来源。
是否会仅从您的应用程序或网站中的一段代码将表写入 ( insert
/ )?update
如果数据库有另一个接口,比如一个 REST API 侦听器,如果你不再输入相同的值,你就会遇到非统一数据的问题——这正是 db 能够防止的。
If a coding error (or hack) bypasses your app/website controls for data (size limits, or worse) then at least your db will still be maintaining the data correctly.
为了使事情变得动态,您使用 VARCHAR(50),因为将来可能会超过字符串大小,并且您知道最大大小可以是 50,但是对于常量,您可以使用 CHAR(30),这意味着大小字符串总是 30 ,如果大小超过或减少,我的 sql 将报告异常
您可以使用 VARCHAR(50) 或 VARCHAR(30)。这不是问题,但如果它是动态的,我们就无法判断极限。
在这种情况下,我们采取最大限制。
当内存使用是您唯一关心的问题时,您可以为 varchar 提供任意大的数字。但是,如果您想确保保持上限,则将其作为 varchar 的最大值。