2009-09-03 16 views
1

私は他の誰かがコーディングしたプロジェクトを修正しようとしています。mysqlに短い番号を格納するのに最適な方法

編集ユーザープロフィールページには、以下のようなものがあり、ユーザーが教育レベルで選択できるオプションのラジオ選択ボックスがすべて表示されます。これは1アイテムです。そのように多くのアイテムがありますここでの回答は、このコードの他の多くの機能にも適用できます。

多くのプロファイルフィールドに対して配列を使用した場合、可能な回答が格納されますが、ユーザーはこの場合でも1つの回答しか選択できません。したがって、教育の場合、7つの可能な回答があり、配列の数字に対応する数字がmysql DBに格納されていれば、この1の数字をvarchar 255の長さとして保存することができません。

長さが1のvarcharとして格納するか、列挙型を使用して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) 

?> 
+0

これはMAXの長さが255のvarcharです。数値を格納するのは良い方法ではありませんが、必要な長さが短ければ少ないほど使用されます。 – pavium

+0

@pavium:MySQLがメモリ内にテンポラリテーブルを作成するとき(結果セットをソートするときなど)、それはCHARカラムであるかのように、各行に完全な255バイトを割り当てます。 –

答えて

3

これが新しいプロジェクトだった場合は、ENUMを使用することをおすすめします。スペース効率が良い(実際には1バイトに格納されている)使いやすい。ただし、レガシーコードをサポートする必要がある場合は、生の数値を使用してその列をTINYINTに変更することをおすすめします。

また、PHPのソースコードの数値を定数で置き換えることをお勧めします。そのため、コードの内容を推測する必要はありません。例:

1

は、varchar型は、(1)列挙型は、これまで二桁、(1)が壊れるvarchar型に到達した場合を除いてはvarchar(255)と全く同じくらいのスペースを取るでしょう。 < = 255 max charsのvarcharフィールドは、文字列の長さに1バイト、文字列に1バイトを格納します。したがって、1桁の数字の場合、varchar(255)は2バイト必要です。

しかし、彼らが整数クラスの1つを使用しなかった理由は、私が超えています。

3

なぜ使用しないでくださいTINY INT?答えが< 255であればあなたのニーズに合っています:)私のテストによれば、インデックス作成と選択ではvarchrarsよりも高速です。

0

私の場合は、プロファイルを含む別のテーブルを作成してから、SelectタグにSQLクエリの結果を入力します。インデックスが整数になるようにします(これがどんなものになるかわからなくても)。エンドユーザはコードに触れなくても説明を変更できます(SQLアクセスがあると仮定して)。

1

頻繁に変更されないようにするには、ENUMを使用する必要があります。スペース効率が最も優れています。また、他の場所で定義されているマジックナンバーを使用するよりも、