2014-04-30 41 views
4

我正在使用PHP從MySQL數據庫中查詢CSS設置,然後將其回傳到CSS樣式表中。示例代碼片段如下:在RGB中存儲RGB顏色。 char或int更好?

<?php 
    $connect = //connect string 
    $query = ($connect, "SELECT bgcolor, font FROM displays WHERE name = 'mySettings'"); 
    while ($row = mysqli_query($query)){ 
     $bgcolor = $row[bgcolor]; 
     $font = $row[font]; 
    } 
    echo ' 
     body { 
      background-color: #'.$bgcolor.'; 
      font: '.$font.'; 
     } 
    '; 
?> 

表「displays」對於設置的每個CSS屬性都有一列。每行表示用戶保存的一組顏色/字體/填充/邊距設置。

列「font」是數據類型varchar(50)。什麼數據類型應該是「bgcolor」? CSS希望看到一個十六進制值,但MySQL中沒有十六進制數據類型。邏輯選擇是將值存儲爲int類型,並在SELECT語句中使用HEX()函數。

然後,再次,可能會更容易和/或使用更少的空間來存儲它作爲字符(6)? PHP只是作爲一個字符串對待,而不是實際的數字。十六進制值不會有任何數學函數應用於它;它只是粘貼到CSS中。

在這樣的情況下,是否有任何優惠之間的價值存儲爲int或char?

+3

總是將該東西存儲爲字符串,而不是數字。電話號碼通常應該作爲字符串存儲,而不是數字 – CRABOLO

+5

我只是將CSS屬性值完全存儲爲數據庫中的字符串(例如「#ab382d」 )。沒有在CSS中對'#'進行硬編碼,你甚至可以存儲諸如「透明」或「藍色」之類的東西,它仍然可以在你的CSS中工作。 –

+0

你的顏色可以有前導0,所以一種選擇是保存爲一個字符串,另一種是使用'hexdec()'並存儲爲數字,但是你必須記得使用函數通過反轉來獲取十六進制。 – sunshinejr

回答

12

對我的評論擴大:

由於值僅用於顯示目的,我將完全存儲CSS屬性值,不管它可能是,作爲一個字符串數據庫,如:

#ab382d 

這將消除需要有「#」在你的CSS坐在那裏,所以你可以再潛在存儲值如

  • transparent
  • blue
  • rgb(100, 100, 100)
  • (或任何其他有效background-color屬性值)

,而無需知道如何呈現它。

編輯:您可能還想考慮緩存機制,以減少可能不會經常更改的樣式表信息的數據庫訪問次數。

5

24位和32位RGB值可以表示爲32位整數,因此爲了高效存儲,您可以使用int,但是您總是需要將其解碼爲人類可讀或CSS可讀的內容加載和保存。

僞代碼:

UInt32 rgba = color.R | (color.G << 8) | (color.B << 16) | (color.A << 24); 
Color color = Color.FromRgba(rgba & 0xFF, (rgba >> 8) & 0xFF, (rgba >> 16) & 0xFF, (rgba >> 24) & 0xFF); 
0

這就是我所做的:

在不同的列中存儲紅色,綠色和藍色。每個作爲TINYINT。由於tinyint介於0到255之間(無符號),所以不會浪費任何一位,並且可以根據需要過濾結果(紅色,淡色,深色等)。