簡體   English   中英

在MySQL中存儲短號的最佳方法

[英]Best way to store a short number in mysql

我正在嘗試修復別人編碼的項目,真是一團糟!

在“編輯用戶個人資料”頁面上,他們下面有類似的內容,其中列出了用戶可以為該學歷選擇的選項的所有可用單選框,這只是一項,有很多類似的內容,因此根據此處的答案,我可以將其應用於此代碼的許多其他功能。

他們為許多配置文件字段使用了一個數組,它將存儲可能的答案。盡管在這種情況下,用戶只能選擇1個答案。 因此,對於教育來說,有7個可能的答案,並且與數組中的數字相對應的數字存儲在mysql DB中,他們將這1個數字存儲為varchar 255長度,這不太好。

我應該將其存儲為長度為1的varchar還是使用enum並列出7個選項或其他內容?

教育

<?PHP
// Array of possible education profile selections
$arr_education[1]="No Answer";
$arr_education[2]="High school";
$arr_education[3]="Some college";
$arr_education[4]="In college";
$arr_education[5]="College graduate";
$arr_education[6]="Grad / professional school";
$arr_education[7]="Post grad";

// shows the array above as checkboxes on a form
foreach($arr_education as $ind=>$val) {  
    echo '<input type="radio" name="education" value="' .$ind. '" ' if($education==$ind){ echo "checked";}. '>' .$val. '<br>';
}



//on a users profile page there would be something like this
$education = 7; // seven would be Post Grad from our array above
echo $arr_education[$education]

//Now here is the mysql table, they chose to use a varchar(255) which seems retarded, using the above code, the max result would be 1 charachter long
education   varchar(255)

?>

為什么不使用TINY INT 如果答案小於255,則它更適合您的需求:)我的測試表明,在索引和選擇方面,它比varchrars更快。

如果這是一個新項目,建議您使用ENUM。 它節省空間(實際上存儲在1個字節中)並且易於使用。 但是,如果您必須支持舊代碼,那么我建議您堅持使用原始數字並將該列更改為TINYINT。

另外,我建議用常量替換PHP源代碼中的數字,這樣您就不必猜測代碼的作用了。 例如:

define('EDU_NO_ANSWER', 0);
define('EDU_HIGH_SCHOOL', 1);
define('EDU_SOME_COLLEGE', 2);
// etc...

if ($education >= EDU_SOME_COLLEGE)
{
    // student went to college, but you didn't need that
    // comment to know that
}

為此,varchar(1)會占用與varchar(255)一樣多的空間,除非枚舉達到兩位數,則varchar(1)會中斷。 小於等於255個最大字符的varchar字段存儲1個字節作為字符串的長度,然后存儲字符串。 因此,對於一個數字,varchar(255)需要2個字節。

為什么他們不使用整數類之一,這超出了我的范圍。

如果可能的項目不會經常更改,那么您應該使用ENUM,它是最節省空間的,並且比在其他地方定義魔術數字更容易理解所有查詢。

如果是我,我將創建一個單獨的表,其中包含配置文件,然后使用SQL查詢的結果填充Select標記。 將索引設置為整數(畢竟您永遠不知道它會增長成什么。。)它還使最終用戶無需觸摸代碼即可更改描述(假設他們具有SQL訪問權限)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM