mysql ip转换函数 时间处理函数

1、用mysql内置函数转换ip地址和数字

以下的文章主要介绍的是如何用MySQL内置函数来转换ip地址与相关数字,在实际操作中在处理字符格式的时候,例如将54789转换为5,4789这样的,我们只要用:format(12345,0)即可,以下就是具体内容介绍。

MYSql的IP对int的转换函数 select inet_aton(ip) from table_name;
网络地址: 192.168.33.123
每一个值最大不会越过255,也就是十六进制的FF,两个Byte刚好表示的最大值是255,
这样子,就可以用一个32位的整形来保存这个地址 192 168 33 123 1100 0000
1010 1000 0010 0001 0111 1011 把这些二进制合在一起就是32位的数了
11000000101010000010000101111011 十进制为 3232244091 * INET_ATON(expr)
给出一个作为字符串的网络地址的”点地址”(如127.0.0.1)表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。
mysql SELECT INET_ATON(‘209.207.224.40’); – 3520061480
产生的数字总是按照网络字节顺序。如上面的例子,数字按照 209×2^24 +
207×2^16 + 224×2^8 + 40 进行计算。 INET_ATON() 也能理解短格式 IP 地址:
mysql SELECT INET_ATON(‘127.0.0.1’), INET_ATON(‘127.1’); – 2130706433,
2130706433 注释: 在存储由INET_ATON() 产生的值时,推荐你使用 INT
UNSIGNED 列。假如你使用 (带符号) INT列, 则相应的第一个八位组大于127的IP
地址值会被截至 2147483647 (即, INET_ATON(‘127.255.255.255’)
所返回的值)。请参见11.2节,“数值类型”。 * INET_NTOA(expr)
给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的电地址表示。
mysql SELECT INET_NTOA(3520061480); – ‘209.207.224.40’
在做项目时,并不知道这两个函数,所以对IP的处理都是自己写的函数,但是使用时效率却是十分的差,下面函数是把IP转化成整数:
复制代码 代码如下: CREATE FUNCTION
`transIPtoInt`(ip char(31)) RETURNS char(31) begin DECLARE value1
CHAR(10); DECLARE value2 CHAR(10); DECLARE value3 CHAR(10); DECLARE
value4 CHAR(10); set value1=SUBSTRING_INDEX(ip, ‘.’, 1); set
value2=SUBSTRING_INDEX(ip, ‘.’, 2); set value2=SUBSTRING_INDEX(value2,
‘.’, -1); set value3=SUBSTRING_INDEX(ip, ‘.’, -2); set
value3=SUBSTRING_INDEX(value3, ‘.’, 1); set value4=SUBSTRING_INDEX(ip,
‘.’, -1); set value1=value124; set value2=value216; set value3=value38;
return value1+value2+value3+value4; end;
为了IP地址比较的方便,我还写了一个把IP地址中每一段都补足三位的函数,如下:
复制代码 代码如下: CREATE FUNCTION
`fillIp`(ip char(31)) RETURNS char(31) begin DECLARE value1 CHAR(31);
DECLARE value2 CHAR(10); DECLARE value3 CHAR(10); DECLARE value4
CHAR(10); set value1=SUBSTRING_INDEX(ip, ‘.’, 1); set
value2=SUBSTRING_INDEX(ip, ‘.’, 2); set value2=SUBSTRING_INDEX(value2,
‘.’, -1); set value3=SUBSTRING_INDEX(ip, ‘.’, -2); set
value3=SUBSTRING_INDEX(value3, ‘.’, 1); set value4=SUBSTRING_INDEX(ip,
‘.’, -1); set value1=LPAD(value1,3,’0′); set value2=LPAD(value2,3,’0′);
set value3=LPAD(value3,3,’0′); set value4=LPAD(value4,3,’0′); return
CONCAT(value1,’.’,value2,’.’,value3,’.’,value4); end;
以下是一些补充* INET_ATON(expr)
给出一个作为字符串的网络地址的”点地址”(如127.0.0.1)表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。
mysql SELECT INET_ATON(‘209.207.224.40’); – 3520061480
产生的数字总是按照网络字节顺序。如上面的例子,数字按照 209×2563 +
207×2562 + 224×256 + 40 进行计算。 INET_ATON() 也能理解短格式 IP 地址:
mysql SELECT INET_ATON(‘127.0.0.1’), INET_ATON(‘127.1’); – 2130706433,
2130706433 注释: 在存储由INET_ATON() 产生的值时,推荐你使用 INT
UNSIGNED 列。假如你使用 (带符号) INT列, 则相应的第一个八位组大于127的IP
地址值会被截至 2147483647 (即, INET_ATON(‘127.255.255.255’)
所返回的值)。请参见MySQL文档中的“数值类型”。 * INET_NTOA(expr)
给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的电地址表示。

inet_aton:将ip地址转换成数字型
inet_ntoa:将数字型转换成ip地址

用MySQL内置函数转换ip地址和数字

* mysql SELECT INET_NTOA(3520061480); – ‘209.207.224.40’

整型字段的比较比字符串效率高很多,这也符合一项优化原则:字段类型定义使用最合适,最简单的数据类型。
inet_aton()算法,其实借用了国际上对各国IP地址的区分中使用的ip number。
a.b.c.d 的ip number是: a * 256的3次方 + b * 256的2次方 + c *

2、利用mysql的内置函数处理时间戳问题

利用两个内置函数

256的1次方 + d * 256的0次方。

利用mysql的内置函数处理时间戳问题 eg : select
FROM_UNIXTIME(UNIX_TIMESTAMP(),’%Y %D %M %h:%i:%s %x’); 结果: 2004 3rd
August 03:35:48 2004

select FROM_UNIXTIME(UNIX_TIMESTAMP(),’%Y %D %M %h:%i:%s %x’);

inet_aton:将ip地址转换成数字型

文章由爱资料原创本文地址:

inet_ntoa:将数字型转换成ip地址

充分利用mysql内置的format函数

尤其是在处理字符格式的时候,例如将12345转换成12,345这样的,只要用:format(12345,0)即可,如果用format(12345,2)则显示的是12,345.00了…

利用MySQL内置函数处理时间戳问题

eg : select FROM_UnixTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x'); 

结果: 2004 3rd August 03:35:48 2004

利用mysql_convert_table_format转换表类型

需要DBI和DBD的mysql相关模块支持才能用,例子:

mysql_convert_table_format --user=root --password='xx' --type=myisam test yejr 

修改mysql表中的字段名

alter table tb_name change old_col new_col definition... 

利用临时变量

select @var1:=a1+a2 as a_sum,@var2:=b1+b2 as b_sum,@[email protected] as total_sum from test_table xxx; 

用int类型存储ip地址

原先错误的认为必须用bigint才够,后来发现使用int unsigned类型就足够了。
🙂

利用IF函数快速修改ENUM字段值

一个例子:

update rule set enable = if('0' = enable,'1','0') where xxx; 

enable 类型:enum(‘0′,’1’) not null default ‘0’

事务无法嵌套

避免长时间的sleep连接造成的连接数超出问题

设定全局变量 wait_timeout 和 interactive_timeout 为比较小的值,例如

10(s),就能使每个sleep连接在10s之后如果还没有查询的话自动断开。

设定mysql内置函数客户端的提示符(prompt)

export MYSQL_PS1="(u:h:)d> " 

则用 mysql -hlocalhost -uroot -pxx db_name 登录后,提示符变成:

(root:localhost:)db_name> 

好用吧 :), 时时刻刻提醒你在哪个服务器上,尽量避免误操作的发生

更详细的请查看MySQL手册

整理MyISAM碎片

1.) 定期运行 OPTIMIZE TABLE 命令即可

2.)
用mysqldump出数据,然后重新import回去,这对大表来说显然第一种方法比较方便

整理Innodb碎片

1.) 运行NULL命令, ALTER TABLE XXX ENGINE=Innodb;

2.) 同上的mysqldump方法

MySQL如果认为检索的记录数量超过总记录数的30%,则选择全表扫描,而非使用索引

MySQL 5.0.3之后,VARCHAR字段后面的空格就不再删除

升级到4.1.1或更高后,就很难降级回到4.0或4.1了,因为 InnoDB
使用了多个表空间的缘故

MySQL
4.1之后,MySQL把字符串类型字段的长度定义理解为字符长度而不是字节长度

MySQL 4.1=>5.0时,增加了一个新的启动选项 innodb_table_locks,它导致
LOCK TABLE 时也可以请求 InnoDB

表锁。这个选项默认打开,不过可能在 AUTOCOMMIT=1 和 LOCK TABLES
应用中会导致死锁

5.0.3开始,在计算 DECIMAL 值和舍入精确值的时候采用精确数学,DECIMAL
用更有效的格式来存储

从5.0.12开始,自然连接和使用 USING

的连接,包括外部连接的衍生形式,都按照SQL:2003标准来处理了;这个变化导致减少了自然连接和使用
USING

的连接产生的结果字段数,并且还将按照更合理的顺序显示这些字段,逗号比较符的优先顺序和
JOIN, LEFT JOIN 中的一样了

在以前,等待超时的锁会导致 InnoDB
回滚当前全部事务,从5.0.13开始,就只回滚最近的SQL语句了

InnoDB 和 MyISAM 表中空格结尾的 TEXT 字段索引顺序改变了。因此需要运行
“CHECK TABLE” 语句修复数据表,如果出现错误,就运行

“OPTIMIZE TABLE” 或 “REPAIR TABLE” 语句修复,甚至重新转储(用mysqldump)

MySQL 5.0.3到5.0.5之间版本的 MyISAM 和 InnoDB 表中创建的 DECIMAL
字段升级到5.0.6之后会发生崩溃。

以上的相关内容就是对用MySQL内置函数转换ip地址和数字的介绍,望你能有所收获。

发表评论

电子邮件地址不会被公开。 必填项已用*标注