DBMS如何比较主键?

时间:2012-01-26 12:59:56

标签: database

我想在数据库级别保护我的数据。然后,我认为的解决方案是:有一个带有4列索引的复合主键,其中3个也是外键。

  

name,id_discipline,name_step,year_step

但我来自巴西,用我们的话说我们有口音,所以我对要插入数据库的新数据和已经插入的数据之间的比较感到困惑。一个例子:

如果我插入'Mat' - '1' - '1st' - '2012',在数据库级别,我的数据是保护的,因为这些列是主键,然后我不能插入另一个相等的条目。 ('Mat' - '1' - '1st' - '2012')

问题是,其中名称 name_step 可以有重音符号。 DBMS如何与比较一起工作?我会在口音和比较方面遇到麻烦吗?

我必须使用ISO-8859-1作为我的字符集和商店而不是htmlentities()吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

  • 首先:看起来你对术语有点困惑。每个表最多只有1个主键(毕竟这是'主要'来自的地方)。可能有更多的键或索引列(这些是外键 - 它们是其他表的键,但是对于这个表,它们只是带有约束的索引字段)。

  • 是否可以存储带重音的字符串取决于数据类型。对于存储国家字符串,使用NVARCHAR数据类型,如何处理和存储非ascii字符取决于所使用的字符集 - 这随所使用的DBMS而变化。与其他数据类型一样,可以比较NVARCHAR。

  • 为了比较NVARCHAR字符串校对来到现场。这说明如何说出哪些字符串比其他字符串“更小/更大”。同样,细节因DBMS而异。在谈论索引时,校对并不重要(在那里,你只对字符串是否相同感兴趣),在你订购时它变得很重要。

  • 数字ID作为主键是一种很好的做法。您可以为字符串数据提供索引以便快速查询,同时,当您可以使用数字ID指定记录时,数据操作会更容易。

编辑: 所以,问题和你的评论:

如果确保按照DB期望输入数据,则比较将起作用。这意味着,在您的代码中,数据必须位于为表/列定义的字符集中(如果您未指定任何字符集,则为数据库的缺省值)。通常,最简单的方法是使用NVARCHAR作为包含国家语言字符串的字段的数据类型,并在代码侧输入unicode字符串。

从技术上讲,可以使用VARCHAR存储natinal字符串,但更容易弄错 - 你必须确保在任何地方保持相同的字符集设置:表定义,数据库连接,代码。当您突然需要输入未包含在所选字符集中的重音字符时,您可能很容易陷入死胡同,因此我强烈建议您使用NVARCHAR和unicode。