8

配列型の変数があり、そのままデータベース(mysql)に格納したいのですが、普段Javaで表示用に使っているtinyblobを適用すると、異常な出力が返ってきます。では、php の配列の正しいデータ型は何ですか。

$countryGoup=array("USA","FRANCE","GERMANY","BRITAIN");
4

1 に答える 1

17

あなたは出来る:

1) 値が少なく固定されている場合は、SET データ型を使用します。

CREATE TABLEステートメントで列をSET('USA', 'France', 'Germany', ...) NOT NULL(not null オプション) として定義し、次のようなクエリを使用します。

INSERT INTO myTable SET countries="USA,Germany";

2) 外部参照のあるルックアップ テーブルを使用する

したがって、countriesテーブルを定義します。

id_country|name
----------+-----------
1         |USA
2         |Germany
3         |France

メイン オブジェクト (例: 「ユーザー」) を国にリンクするピボット テーブルを定義して、多対多の関係を確立します。

たとえば、テーブルは次のようにテーブルをテーブルにusers_countriesリンクします。userscountries

id_user|id_country
------------------
1      |1
1      |2
2      |1

この例では、ユーザー 1 は ID 1 と 2 (米国とドイツ) を持つ国にリンクされ、ユーザー 2 は米国のみにリンクされます。


3) コンマ区切りの文字列またはその他の区切り文字を使用するか、配列をシリアル化します

これには、サーバー側言語 (あなたの場合は PHP) を使用して値を区切り文字 (コンマ,やパイプなど) で連結することが含まれます|

$countries = array("USA", "Russia", "Iran");
$countriesString = implode (",", $countries); // $countriesString = "Usa,Russia,Iran"
$query = "INSERT INTO mytable SET countries = '" . $countriesString . "'";

(注: 文字列値は例としてエスケープされていませんが、良い習慣ではありません)

データベースから値を取得するときは、入力した文字列を取得し$array = explode(",", $retrievedValueFromDb)、同じ区切り文字を使用して配列を再度取得します。

アップデート:

4) 値の取得 find_in_set() MySQL 関数

find_in_set(needle, field)文字列がコンマ区切り値フィールドに存在する場合、ゼロより大きい整数を返す関数にも依存できます。

したがって、アプローチ 1) を使用し、 のような文字列フィールドがある場合、次を使用して が存在する"USA,Germany"列を取得できます。USA

SELECT * FROM myTable WHERE find_in_set('USA', countries) <> 0

アプローチ1)は、固定値がほとんどない場合に機能し、クエリでも非常に簡単です。欠点は、値が 64 個に制限されていること、値を固定する必要があること、およびセパレータとして使用されるコンマ (,) を含めることができないことです。

アプローチ 2)は最も標準化されており、正しく、正規化されており、クエリ効率も高い

アプローチ 3)は簡単ですが、追加の処理が必要であり、SQL ではそれほど簡単ではありません

他の場所で述べたように、dbms には「配列」データ型はありません。回避策を使用する必要があります。

于 2012-08-11T11:52:36.290 に答える