Mysql kısa bir sayı saklamak için en iyi yolu

5 Cevap php

Ben başkasının kodlu bir proje düzeltmek için çalışıyorum, bu bir felaket!

Bir düzenleme kullanıcı profili sayfada hepsi mevcut radyo bir kullanıcı eğitim düzeyi için, bu sadece 1 öğe seçebilirsiniz seçenekler için kutuları seçin listeler aşağıda böyle bir şey var, bu yüzden burada cevaplar dayalı bunun gibi birçok öğe var Ben bu kodu birçok diğer özellikleri uygulayabilirsiniz.

Onlar birçok profil alanları için, bu bir kullanıcı yalnızca bu durumda olsa 1 cevap seçebilir, olası cevaplar saklamak istiyorsunuz bir dizi kullanılır. Dolayısıyla eğitim için, 7 olası cevap ve dizide sayı ile gelen bir sayı bir mysql veritabanında saklanır, orada onlar iyi olamaz bir varchar 255 uzunluğu gibi bu 1 numarayı saklayın.

Ben uzunluk veya kullanım enum için 1 ile varchar olarak saklamak ve 7 seçenekleri, veya başka bir şey listelemek gerekir?

Eğitim

<?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)

?>

5 Cevap

Bu yeni bir proje olsaydı, ben ENUM kullanmanızı tavsiye ediyorum. Bu verimli alan (aslında 1 bayt depolandığını) ve kullanımı basit. Ancak, eski kod destek varsa o zaman ben çiğ numaraları yapışmasını tavsiye ve bir TINYINT içine sütunu değiştirmek istiyorum.

Eğer kodu ne tahmin gerekmez böylece Ayrıca, ben, sabitler ile PHP kaynak kodu numaralarını değiştirmenizi tavsiye ederim. Örneğin:

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
}

Neden kullanmayın TINY INT? Cevaplar olurdu ihtiyaçlarınıza daha uygun < Benim testlerde :) 255 o indeksleme ve seçiminde varchrars daha hızlı olduğunu gösteriyor.

Bunun için, bir varchar (1) enum hiç çift hanelere ulaştığı takdirde, bir varchar (1) kıracak dışında bir varchar (255) gibi tam olarak çok yer alacaktı. Sonra <= 255 maksimum karakter depolar dize uzunluğu için 1 bayt, ve dize bir varchar alan. Yani tek basamaklı bir sayı için, varchar (255) 2 bayt alır.

Onlar tamsayı sınıflarından birini kullanmak vermedi, neden, ancak, beni aşıyor.

Olası öğeleri genellikle değişecek değilseniz, o zaman verimli en alandır, ve ayrıca tüm sorguların çok daha okunabilir bir yerde tanımlanan sihirli numaraları olan daha yapar, bir ENUM kullanmalısınız.

Benim olsaydı, ben bir SQL sorgusu sonuçları ile Seç etiketini doldurmak sonra, içinde profilleri ile ayrı bir tablo oluşturmak istiyorum. (Eğer bu içine büyüyecek asla bilemezsiniz bütün .. sonra) Ayrıca enduser (onlar SQL erişimi var varsayarak) kod dokunmak zorunda kalmadan tanımlamalarını değiştirmek için izin verecek endekslemek bir tamsayı olun