ipv4轉成int存儲
㈠ C語言中,IPv4和IPv6地址用什麼數據格式存儲
ipv4中的ip地址長度才為32位 ,實際上還會包含報頭、版本號、記錄上層信息的數據結構等等。不是一個數據類型就可以表示的,都是採用結構體的形式。
有興趣可以看看Tcp_ip協議(共3卷)。
㈡ 什麼是存儲在sql伺服器的IP地址最合適的數據類型
1. 存儲一個IPv4地址作為binary(4)是最真實的,以究竟意味著什麼,並且可以很容易面罩式的查詢。但是,它需要轉換和退出,如果你的文本後表示,實際上。在這種情況下,您可能更喜歡一個字元串格式。 一個SQL Server的函數 CodeGo.net,可以幫助如果你是存儲為一個字元串是PARSENAME順便提一下。不是專為IP地址,但完全適合他們。下面的調用將返回'14':SELECT PARSENAME('123.234.23.14', 1)
(編號為從右到左)。
2. 我通常為varchar(15),用於IPv4地址-但它們排序是一種痛苦,除非你墊零。 我還保存它們作為過去的詮釋。System.Net.IPAddress有GetAddressBytes方法,該方法將返回的IP地址為4位元組表示的IP地址的數組。你下面的C#代碼的轉換IPAddress到int...var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
我,我不得不做了很多尋找重復數據刪除的地址,並希望該指標是小&越快越好。然後拉地址背出的int和成IPAddressNET中的對象,請使用GetBytes在方法BitConverter得到int作為一個位元組數組。通過該位元組數組的構造函數IPAddress這需要一個位元組數組,你最終備份與IPAddress您開始使用。var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
3. 對於這個在接受的答案 它們排序是一種痛苦,除非你墊 零。 下面是SQL Server 2008的一個把戲(從伊茨克奔甘在這本書)with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address
)
select ip_address
from ip_addresses
ORDER BY CAST('/' + ip_address + '/' AS hierarchyid)
回報ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201
4. 我最喜歡的文章談到為什麼你不該'正則表達式來解析IP地址。大多數他們正在談論的是真正解釋為什麼你應該非常小心的IP地址的文本表示。我建議你決定什麼數據類型在資料庫中之前讀它,大概也因為種種處理您的應用程序會做(即使文章是寫關於Perl,它的任何語言)。 我想在年底的32位數據類型(或4個8位數據類型)將是最好的選擇。
5. 我在這里讀了很多類似的問題,並沒有在這個在別人的頭號答案的答復:「對於IPv4地址,您可能希望將它們保存為一個無符號整型的INET_ATON()和INET_NTOA()函數返回其值的IP地址,反之亦然「。我想這就是我要在我的分貝走,除非我在上面決定。
6. 最好的方法(當不需要排序和對IP的其他控制)是其存儲為整數,將其存儲為varchar等將花費不僅僅是一個簡單的無辜整型的方式更多的性能。 有一個屬性IPAddress.Address但它是過時的,我也不知道為什麼,因為如果你不需要排序或通過IP類控制,最好的辦法是將其存儲為無符號整數(即有一個最大值0xffffffff它等於255.255.255.255在十進製表示。 也IPAddress類有一個接受長期的構造 並根據VS調試器可視化工具,即IPAddress類本身存儲它的內部變數作為一個數字(而不是位元組數組)。 了解更多關於存儲的解決方法在MS SQL Server的單位: 在MS SQL 4位元組無符號整型? SQL Server的4位元組無符號整型
7. IPV4? INT?或TINYINT×4? 這真的取決於它是否只是存儲和檢索或如果它的將是一個遠程的搜索條件。
8. 不要忘了IPv6的-你需要更多的房間,如果你需要存儲它們-128為IPv4的32。 我會去的bigint,但你需要幫手的代碼翻譯到人類友好的版本。
9. 對於空間高效的存儲和當值是要被處理(匹配的范圍),一個int。 IP地址真的只是一個32位的值。 對於一個簡單的解決方案,你只是要存儲的值來查看它,一varchar(15)存儲IP地址的字元串表示表單。
10. 我可能會用一個去varchar或char。 和大小設置為15。
11. PHP,然後PHP5有2個內置的轉換函數: ip2long和long2ip(或)它返回/轉換有符號整數
12. 我已經受夠了進行四SMALLINT(或其他短小的整數數據類型,你喜歡)列-每個八位位組。然後,你可以做一個視圖,它摔破在一起作為一個char字元串(顯示)或則你可以寫簡單的運算符來決定誰都是在等什麼 這是相當快的(只要你做正確的索引),並且還允許很容易查詢(沒有字元串操作!)。
13. 由於IP地址有32位,它可以你很長的保存價值? 它不會是因為空間浪費VARCHAR,但隨後你會收到將其解碼回一個IP,每一個和時延和開銷成本可能不值得。
14. 引用這樣的: 在CHAR存儲IP地址(15)柱。這取決於有多少數據要存儲,這可能是非常浪費的(為什麼我們需要存儲的點?)
㈢ 關於mysql資料庫裡面數據類型number的問題
MySQL 數據類型細分下來,大概有以下幾類:
數值,典型代表為 tinyint,int,bigint
浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞
字元串,典型代表為 char,varchar
時間日期,典型代表為 date,datetime,time,timestamp
二進制,典型代表為 binary,varbinary
位類型
枚舉類型
集合類型
大對象,比如 text,blob
json 文檔類型
一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據范圍的不同,選擇不同的類型。
注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。
1. 如果時間有可能超過時間戳范圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。
建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。
當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 Duplicates: 0 Warnings: 0
五、二進制類型
binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。
行結束符不一樣。char 的行結束符是 ,binary 的行結束符是 0x00。
由於是二進制存儲,所以字元編碼以及排序規則這類就直接無效了。
六、位類型
1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進制來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進制來過濾。
創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)->create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)->select cast(gender as unsigned) 'f1' from c1;+------+| f1 |+------+| 0 || 1 |+------+2 rows in set (0.00 sec)
過濾數據也一樣,二進制或者直接十進制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = b'1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = '1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)
mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)
mysql-(ytt/3305)->select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)
mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 Duplicates: 0 Warnings: 0
兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd
檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。
七、枚舉類型
1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。
創建表 t7。mysql-(ytt/3305)->create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)
1. 最大佔用 8 Byte,int64。2. 內部以二進制位的方式存儲,對應的下標如果以十進制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。
mysql-(ytt/3305)->create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( SELECT 1 AS cnt UNION ALL SELECT cnt + 1 FROM ytt_number WHERE cnt < pow(2, 7) )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 Duplicates: 0 Warnings: 0
示例 10
mysql-(ytt/3305)->select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)
綜上所述,日期這塊類型的選擇遵循以下原則:
4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。
示例 5
binary 和 varbinary 對應了 char 和 varchar 的二進制存儲,相關的特性都一樣。不同的有以下幾點:
示例 6
來看這個 binary 存取的簡單示例,還是之前的變數 @a。
切記!這里要提前計算好 @a 佔用的位元組數,以防存儲溢出。
bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進制方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:
示例 7
其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。
那現在我給表 c1 簡單的造點測試數據。
把 c1 的數據全部插入 c2。
枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:
示例 8
八、集合類型
集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:
示例 9
定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。
插入 1 到 128 的所有組合。
九、數據類型在存儲函數中的用法
函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。
定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。
簡單調用下。
總結
本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。