大多數公司的表結構都需要經過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>下面看php函式的使用:select inet_ntoa(3232235521); +--
---------------------+
| inet_ntoa(3232235521) |+--
---------------------+
|192.168.0.1|+--
---------------------+
1row in
set (0.00sec)
mysql
>
<?phpecho
ip2long('192.168.0.1');
?>
php test.php可以看到結果是一樣的,如果要把整形轉換為ip位址,再使用php的long2ip()就行,這裡就不再寫了。3232235521
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) isnotnull ;
mysql>2. 把字段改為int型別。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)
mysql> show createtable
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)
alter3. 程式**改動。table `t1` modify ip int unsigned not
null;
總結:字段型別用合適的,夠用就行,能省則省,在資料量上去以後,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裡面,開...