8

我有一个数组类型的变量,我想将它按原样存储在数据库(mysql)中,当我应用我通常在 java 中使用的 tinyblob 进行显示时,它返回异常输出。那么 php.ini 中数组的正确数据类型是什么?

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

1 回答 1

17

你可以:

1) 如果值很少且固定,则使用 SET 数据类型

CREATE TABLE您将语句中的列定义为SET('USA', 'France', 'Germany', ...) NOT NULL(非 null 可选),并使用如下查询:

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

2) 使用带有外部引用的查找表

所以你定义一个countries表:

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

并定义一个将您的主要对象(例如“用户”)链接到国家/地区的数据透视表,从而建立多对多关系

F.ex.,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 回答