IP位址在資料庫裡面的儲存方式

2021-08-09 07:23:50 字數 3505 閱讀 8500

大多數公司的表結構都需要經過dba進行審核,有時候你會看到儲存ip位址採用varchar(15),這種方式都是傳統的做法,這種方法需要占用15個位元組,那麼有更省空間的做法麼?肯定是有的,那就是用int儲存。如果採用int儲存這裡又有2種處理方式。

1. 利用mysql函式進行處理。可以採用inet_aton,inet_ntoa函式進行轉換。

2. 利用開發語言的函式進行處理,以php進行舉例。可以採用ip2long,long2ip函式進行轉換。

上面2種方法得到的結果都是一致的。因為演算法都是一樣的。

下面進行函式用法的演示。首先看看用mysql自己的函式如何玩。先把ip位址轉換int。

mysql>

select inet_aton('

192.168.0.1');

+--------------------------+

| inet_aton('

192.168.0.1

') |+--

------------------------+

|3232235521|+--

------------------------+

1row in

set (0.00sec)

mysql

>

mysql>

select inet_ntoa(3232235521); +--

---------------------+

| inet_ntoa(3232235521) |+--

---------------------+

|192.168.0.1|+--

---------------------+

1row in

set (0.00sec)

mysql

>

下面看php函式的使用:

<?php 

echo

ip2long('192.168.0.1');

?>

php test.php 

3232235521

可以看到結果是一樣的,如果要把整形轉換為ip位址,再使用php的long2ip()就行,這裡就不再寫了。

mysql儲存這個值是字段需要用int unsigned。不用unsigned的話,128以上的ip段就儲存不了。當然可以使用bigint,但是請記住,能摳門就要摳門。省一點是一點,哈哈。

php存入時:$ip = ip2long($ip);

mysqll取出時:select inet_aton(ip) from table ...

php取出時,多一步:$ip = long2ip($ip);

那麼以前就是varchar型別,那麼如何轉換呢?下面慢慢道來。

1. 把以前的varchar()資料轉換為int型的sql語句如下。

update t1 set ip =  inet_aton(ip) where inet_aton(ip) is

notnull ;

mysql>

select

*from

t1;+

------+-------------+

| id | ip |+--

----+-------------+

|1|

192.168.0.1|

|2|

192.168.0.2|+--

----+-------------+

2rows in

set (0.00sec)

mysql

>

update t1 set ip = inet_aton(ip) where inet_aton(ip) is

notnull

;

query ok,

2rows affected (0.00sec)

rows matched:

2changed:2warnings:0mysql

>

select

*from

t1;+

------+------------+

| id | ip |+--

----+------------+

|1|

3232235521|

|2|

3232235522|+--

----+------------+

2rows in

set (0.00sec)

2. 把字段改為int型別。

mysql> show create

table

t1\g

***************************

1. row ***************************

table

: t1

create

table: create

table

`t1` (

`id`

int(11) default

null

, `ip`

varchar(15) default

null

) engine

=innodb default charset=

utf8

1row in

set (0.00sec)

alter

table `t1` modify ip int unsigned not

null;

3. 程式**改動。

總結:字段型別用合適的,夠用就行,能省則省,在資料量上去以後,10個位元組和5個位元組相差的資料量會讓你吃驚。

原文:

IP位址如何在資料庫裡面的儲存

比較傳統儲存ip位址的方法是採用varchar 15 但是這種方法需要占用15個位元組空間,那麼有沒有更加節省空間的做法麼?答案就是用int儲存。採用int儲存有2種處理方式。方法一 利用資料庫函式進行處理。以mysql為例可以採用inet aton,inet ntoa函式進行轉換。inet nto...

在windows裡面的資料庫裡面存emoji表情

1,把連線資料庫的unicdoe utf 8給去掉,那個url 2,關閉mysql的服務,修改my.ini 具體如下 default character set utf8mb4 character set server utf8mb4 collation server utf8mb4 unicode...

讀取資料庫裡面的值出現亂碼

eeclipse裡的中文都是亂碼,包括注釋,但資料庫裡面的資訊可以顯示中文,從資料庫裡面讀取值的時候出現亂碼,需要改兩個地方 1.在eeclipse裡面,開啟properties resource text file encoding,選第乙個選項 不是other 2.還是在eeclipse裡面,開...