2015-11-21 33 views
1

我有一个表是这样的:如何将字符串转换为唯一编号?

// viewed 
+----+------------------+ 
| id | username_or_ip | 
+----+------------------+ 

正如你看到的,username_or_ip列保持usernameip。其类型是INT(11) UNSIGNED。我存储IP这样的:

INSERT table(ip) VALUES (INET_ATON('192.168.0.1')); 

// It will be saved like this: ip = 3232235521 

好了,我想知道,有没有像Sajad一个字符串转换为一个唯一的编号任何方式? (因为正如我所说,username_or_ip只是接受数位值)

+0

为什么你将'Ip'保存为int?特别是如果你将它与'Username'混合使用,varchar会更合适,但更推荐将'ip'和'username'作为'varchar'放在不同的列中。 –

+0

@OrelEraki那么,你的报价是什么?使用'VARCHAR(50)'类型? – Shafizadeh

+0

尽可能多地限制项目的用户名长度。 –

回答

2

int(11)是一个32位的数据类型。正因为如此,它足以容纳一个ipv4地址。你的问题指出了。

可逆地对将任意字符串转换为32位数据类型很困难:它简单地缺乏信息存储容量。

您可以使用查找表来达到此目的。包括php 5.4+在内的许多语言都支持使用名为“interning”的过程。 https://en.wikipedia.org/wiki/String_interning

或者你可以在MySQL表中建立自己的查找表。其列将是id列和value列。你会实习生每个新的文本字符串通过创建一个具有唯一id值的行,然后使用该值。

你对直接查找varchar(255)或MySQL中的类似值的速度的直觉是合理的。但是,这是不正确的。正确编制索引后,具有这种数据的表格搜索速度非常快。

+1

嗯,谢谢,+1 – Shafizadeh

+0

真的吗?!所以,如果在'varchar'或'int'列中查找的速度是相同的,那么我只是简单地使用'varchar'! – Shafizadeh

+1

速度不一样。显然,字符串中有更多的数据。但是使用像MySQL这样的DBMS的全部重点是将这种查找的负担放在别人身上,这样你就可以在合理的时间内建立你的应用程序。实施MySQL的人已经快速地进行了字符串查找。 –

相关问题