2014-10-08 38 views
0

我有表Users有一列型VARCHAR(15)user。我可以插入一段到它:我应该如何正确存储和检索IP?

INSERT INTO `LJ`.`Users` (`user`) VALUES ('.') 

现在我想搜索这一段:

SELECT * FROM `Users` WHERE `user` LIKE '.' 

SELECT * FROM `Users` WHERE `user` = '.' 

在这两种情况下,现有的条目中找不到:

MySQL返回一个空结果集(即零行)。 (查询花了0.0001秒)

与逗号相同的问题。

其实,我的意图是存储IP地址,如125.50.75.80,但我已经把问题归结为无法搜索标点符号。我试过了 '\。'也无济于事。

这是文字问题;如何处理变量,包含带句点的字符串?

更新:我已经在命令行中与表中创建一个数据库进行测试:

CREATE TABLE LJ.Users (user VARCHAR(15)); 

,一切工作正常。我怀疑的东西是错误与phpMyAdmin的创建我的数据库:

table

+0

让我知道这是否有助于你。 – Prix 2014-10-09 01:16:25

+0

亲爱的@Prix,这非常有帮助,非常感谢!它现在可以完美无瑕地高效工作!我认为你参与SQL小提琴?我准备捐款。 – 2014-10-09 03:51:49

+0

@Prix,完成 - 再次感谢! – 2014-10-09 13:49:51

回答

0

当前的问题与你的VARCHAR列是你使用armscii8_general_ci其中将一部分存储的字符如逗号和点的整理型。

See example here.

也许你想用的utf8_general_ci这将产生你想要的结果:

See example here.


不要使用VARCHAR储存的IPv4,使用INT unsigned然后你可以使用INET_ATON()INET_NTOA()函数返回/插入/比较IPv4。

CREATE TABLE users 
(
    user_ip INT unsigned 
); 

然后插入一个IPv4可以使用:

INSERT INTO users (user_ip) VALUES (INET_ATON('125.50.75.80')); 

然后,你可以这样阅读:

SELECT INET_NTOA(user_ip) FROM users WHERE user_ip = INET_ATON('125.50.75.80') 

Live DEMO.

+0

注意:IPv6地址不起作用:-)它“空”!应该在这个时候提及“新”技术。 – 2014-10-08 22:56:31

+1

@DennisZiolkowski由于OP是存储IPv4而不是IPv6,所以不用说,根据他的列大小来判断,无论我是否已经更新它来反映它的IPv4 – Prix 2014-10-08 22:59:23