现场数据类型/验证问题

时间:2010-11-27 06:35:07

标签: database validation field

我对使用什么数据类型以及如何从我的网站定义某些字段几乎没有疑问。我当前的架构是在MySQL中,但正在改为PostregSQL。

  1. First&姓氏 - >由于我有多个表,所有表都支持UTF-8,但是如果用户输入中文名称,我是否需要将它们声明为nvarchar?如果是这样,如果它被设置为仅接受字母表,我如何强制执行字段验证,因为我认为这些是英文字母并且不验证有效的中文或阿拉伯字母?我认为PostregSQL不支持nvarchar吗?

  2. 存储当前时间线 - >示例我从2009年1月到现在在A公司工作。所以我假设将有3个字段:timeline_to,timeline_from,time_line present where to& from是月/年varchars而present只是设置当前日期的标志?

  3. 用户密码。我正在使用SHA 256 + salting。所以我有2个字段声明如下:
    password_hash - varchar(64)
    password_salt- varchar(64)
    如果用户密码需要介于8到32个字符之间,这是否有效?

  4. 出生时间 - >我需要记录应用程序的出生时间来计算一些占星值。所以这意味着小时,分钟和上午/下午。所以最好存储这些是带有varchar的3个单独的单个选择列表,或者在后端使用时间数据类型并允许用户在前端使用单个选择列表?

  5. 最后,对于出生月份和年份,如果我将它们存储在单独的行中,这些是int还是varchar?它们都有int的主键用于报告目的,所以int更有意义吗?或者我应该只将它们作为日期类型存储在1个字段中?

2 个答案:

答案 0 :(得分:1)

  1. NCHAR,不是NVARCHAR。

    • 永远不要做任何可以修复的变量;在每次访问时打包/解压都是一个额外的负担。这意味着永远不会对索引列使用var,你的索引会非常缓慢。这些天磁盘空间很便宜。

    • 您需要Language级别的Person列,告诉您在各种解析和验证要求中使用的语言。

  2. 假设您有Person, EmployerEmployment个表格。您讨论的列位于Employment

    • 您需要一个StartDate列和EndDate列,它们是DATETIME数据类型。

    • 您不需要将“present”作为单独的列。 “Present”始终是最新Employment行的值,除非设置为不同的值。设置db可以处理的最高日期的默认值,例如。 9999-12-31;可以通过明确的条目覆盖。

  3. 没有。您只需要一个CHAR(256)列。汉克已经解释过了。

  4. 对于日期或时间的任何组件,请使用DATETIME数据类型。这就是它的用途。数据库一致地处理它,并完美地对其进行索引。使用db各种函数()对它执行DATE算法。并且您避免将其编码为INT等的所有问题(不允许无效的日期或时间)。

  5. BirthDateTime是一个DATETIME列。

答案 1 :(得分:0)

  1. 我不知道,从来没有多打过那个领域。

  2. 您可以考虑在此处允许NULL并将其用作Present的特殊含义。如果您的应用程序逻辑看到非空的开始日期和空结束日期,则可以推断出这一点。如果它们都是NULL,则无法推断出任何信息。

  3. 由于您正在进行哈希处理,无论输入是什么,您总是会得到一个256位十六进制字符串作为输出,所以是的,8-32个字符的密码都可以正常工作。

    < / LI>
  4. 在后端使用DATETIME。您可以执行MONTH()之类的操作,以便在SQL语法中提取部件。当然,你必须格式化日期恰好让SQL接受它,但这并不太难。

  5. 同样,所有可以在SQL中使用DATETIME函数进行提取。