关于 char varchar 和 tinyint 的问题

Posted

技术标签:

【中文标题】关于 char varchar 和 tinyint 的问题【英文标题】:Questions about char varchar and tinyint 【发布时间】:2012-11-19 21:12:24 【问题描述】:

我正在准备一张注册表单。它的字段/列包括:

student_no(主键) 和年龄

student_no 将保存固定长度为 9 个字符的值,其中包含 8 个数字和一个破折号,例如 11-423685、12-537859、12-974156

我不确定是使用 char 还是 varchar,因为我想在使用它们之前更多地了解这两种类型。具体来说:

    这两种类型中的一种或两种是否可以保存包含键盘上各种符号(-、@、_、$、# 等)的值,例如我如何需要学生编号包含破折号?

    如果我给 char 的长度为 9,给它一个长度为 8 及以下的值是否无效

    需要注意的其他重要差异(如果有)

至于年龄,如果我使用 tinyint 是否需要指定长度?还是我应该将 phpMyAdmin 中的长度字段留空?

注意:这实际上只是一个学校练习,其中的指令是制作一个包含任何 14 个字段的有效注册表,所以我决定暂时不使用生日以避免使用日期。

【问题讨论】:

你所有的答案都在这里得到解答 ....dev.mysql.com/doc/refman/5.0/en/char.html 关于您在deleted question here、<br><input> 中的评论是空元素,因此它们不需要结束标记或/;就像我在这里写的一样写。你应该使用的文档类型是<!doctype html> 【参考方案1】:

INT 不允许任何非数字格式。 VARCHAR 可以。

不过,最好使用 INT 来表示学号,因为 INT 会加快搜索速度。

您可以使用格式在输出时显示带有连字符的学号。数据库应以最有效的格式(未格式化的数字)存储它。

另外,我建议您使用 DATE 来存储birth_date,而不是数字年龄。这将防止随着时间的推移发生年龄变化的问题。同样,您可以计算演示文稿的输出年龄。

【讨论】:

所以如果我需要包含破折号,我应该使用 varchar? 再次,您可以在保存号码之前删除破折号,并在检索后将其添加回来,这是我的建议。但是,如果您坚持在数据库中使用连字符,是的,您必须使用 varchar。 或者,如果可能,考虑将 11 和 423685 存储在单独的列中,尤其是如果它们具有语义意义。 @jmilloy 好点,但我会说如果它们具有语义含义。单个 int 将是性能最佳的选择。【参考方案2】:

CHAR() 很奇怪。它是一个固定长度的字符串,如果您尝试将其设置为较短的值,则会用空格填充。它几乎不适合使用——如果你忘记它曾经存在过,你可能永远不会错过它。

VARCHAR() 在很大程度上按照您的预期工作。它可以包含不超过其最大长度的任何字符串(带有任何字符)。

不要存储年龄。存储出生日期(使用DATE 之类的类型)。但是如果你必须存储一个年龄,数字类型的长度(如TINYINT)几乎没有意义,应该留空。

【讨论】:

以上是关于关于 char varchar 和 tinyint 的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于IsDeleted,Islock,State类型Bit,char,tinyint的探讨

五:MySQL数据类型和属性

mysql关于char和varchar的查询效率问题

MySQL 数据类型

MySQL 数据类型

Mysql中把varchar类型的字段转化为tinyint类型的字段