我的数据库中有一个int(11)
的列,有时我无法将用户名与id数据库匹配,因为名称略有不同(即John Doe而不是Johnathan Doe)。普通ID从11000范围开始,所以我想将它们的名称转换为整数并添加00或其他东西,这样我就可以触发一个标记供某人查看和更新。我知道我可以使用str_pad
来获得00,但我似乎无法生成一定数量的数字,这些数字与名称有些不同。我知道重复的可能性很高,但我不知道我还能用primary/unique
列做什么。任何帮助将不胜感激。
使用mt_rand
和str_pad
的示例:
str_pad(mt_rand(100000000,999999999),11,'00',STR_PAD_LEFT);
任何人都有更好的选择,可能会使用名称字符串吗?
答案 0 :(得分:1)
我的数据库中有一个int(11)
列
该列是一个整数。在存储级别,“11”并不意味着什么。
想象一下,你有一个庞大的用户名表,有人试图第40次输入'John Smith'。你想让我做什么?您是否希望有人将其与所有其他变体进行比较?你想识别和复习变体拼写,比如'Johnathan','Jonathon','John'和'Jhon'?重大决策,但它们不会影响如何处理需要审核的ID号。
要识别需要审核的行,无论出于何种原因,最好将其密钥放入另一个表中。
create table review_sets (
set_id integer not null,
set_created timestamp not null default now(),
rationale varchar(100) not null default 'Duplicate of existing user?',
primary key (set_id),
unique (set_created)
);
create table review_ids (
set_id integer not null,
user_id integer not null,
primary key (set_id, user_id),
foreign key (set_id) references review_sets (set_id),
foreign key (user_id) references users (user_id) -- Not shown.
);
列review_sets.rationale允许您使用区分拼写问题,例如延迟付款或网站滥用。 review_ids表允许您将ID限制为一些变体,而不是所有可能的变体。 (但我不确定它可能有多大用处。)
您可能希望添加标识审阅者的列,审核完成的时间以及审阅者达成的决策。根据您的应用程序,您可能只需在做出决定后删除行。