我已经知道VARCHAR占用的唯一内存是不需要的CHAR,无论是否需要,它总是占用相同数量的内存。
我的问题:假设我有一个字段VARCHAR(50),我知道如果需要存储30个字符,它只会占用30个字节而不会超过30个字节(假设1个字符需要一个字节)。那么为什么我甚至要提到50或30或任何上限,因为它只会占用所需的内存。
更新:为什么我不得不提到上限,因为没有无用的内存占用?
答案 0 :(得分:2)
你不会。你会把它VARCHAR(30)
。这是关于允许的最大字符数。那么为什么你甚至会创建一个30个字符的列接受任何高达50的字符?
答案 1 :(得分:2)
更新:为什么我必须提到上限,因为没有无用的内存占用?
如果您使用final_value = left(provided_value, 30)
之类的内容清理输入,那么它对您的数据库来说不是问题。如果您愿意,可以将其设置为varchar(255)
。
设置最大限制的想法是确保您不会错误地发送比实际计划更多的字符。
将来代码维护很难回想起每个表的每一列的数据大小限制。无论如何,你需要这样做,但是通过查看你的表定义作为有关信息的单一来源。
是否会从您应用或网站中的一段代码中将表格写入(insert
/ update
)?如果有另一个数据库接口,例如REST API监听器,如果你再也不输入相同的值,那么你就会遇到非统一数据的问题 - 究竟是什么db& #39; s能够阻止。
如果编码错误(或黑客)绕过您的应用/网站控制数据(大小限制或更糟),那么至少您的数据库仍将正确维护数据。
答案 2 :(得分:0)
使动态变为动态你正在使用VARCHAR(50),因为将来字符串大小可以超过你知道最大大小可以是50,但对于常量你可以使用CHAR(30),这意味着如果字符串的大小超过或减少,我的sql将报告异常
答案 3 :(得分:0)
您可以使用VARCHAR(50)或VARCHAR(30)。这不是问题,但如果它是动态的,我们无法说出限制。
在这种情况下,我们采取最大限制。
答案 4 :(得分:0)
当您关注内存使用时,您可以为varchar提供任何大数字。但是如果你想确保保留一个上限,那么你要把它作为varchar的最大值。