首頁  >  文章  >  資料庫  >  如何在 MySQL 中高效儲存 IPv6 位址:DECIMAL(39,0) 與 VARBINARY(16)?

如何在 MySQL 中高效儲存 IPv6 位址:DECIMAL(39,0) 與 VARBINARY(16)?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-29 05:36:30718瀏覽

  How to Efficiently Store IPv6 Addresses in MySQL: DECIMAL(39,0) vs. VARBINARY(16)?

在 MySQL 中高效儲存 IPv6 位址

在 MySQL 中高效儲存 IPv6 位址可能是一個挑戰。兩種常用的方法包括使用兩個 BIGINT 欄位或一個 DECIMAL(39,0) 欄位。

DECIMAL(39,0) 的優點和缺點

使用DECIMAL( 39,0) 比2*BIGINT 有幾個優點:

  • 緊湊的大小:
  • DECIMAL(39,0) 欄位將IPv6 位址儲存為單一值,這更方便比使用兩個BIGINT 欄位更緊湊。
  • 更快的查詢:
  • DECIMAL(39,0) 欄位上的查詢通常比兩個 BIGINT 欄位上的查詢更快,特別是對於範圍查詢。

但是,DECIMAL(39,0) 也有一些缺點:
  • 精確度限制:
  • DECIMAL(39,0) 無法處理大於39 位元的IPv6 位址.
  • 缺乏標準:
  • 使用DECIMAL(39,0) 進行IPv6 儲存不是標準化方法,可能並非所有MySQL 版本都支援。

從二進位到十進位的轉換以及反之亦然

要將inet_pton() 傳回的二進位格式轉換為MySQL 可使用的十進位字串格式,您可以使用以下PHP函數:
<code class="php">function binaryToDecimal($binary) {
  $hex = bin2hex($binary);
  return gmp_strval(gmp_init($hex, 16), 10);
}</code>

要將十進製字符串轉換回二進制,請使用以下函數:
<code class="php">function decimalToBinary($decimal) {
  $hex = gmp_strval(gmp_init($decimal), 16);
  return hex2bin($hex);
}</code>

優化IPv6 地址的存儲

不使用DECIMAL(39,0),更有效的選擇是使用VARBINARY(16) 列並利用inet_pton() 和inet_ntop() 函數進行轉換。 MySQL 5.6 及更高版本支援此方法,並提供緊湊性和效能優勢。

以上是如何在 MySQL 中高效儲存 IPv6 位址:DECIMAL(39,0) 與 VARBINARY(16)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn