我有一个数组类型的变量,我想将其存储在数据库(mysql)中,当我应用通常在java中用于显示的tinyblob时,它会返回异常输出。那么 php 中数组的正确数据类型是什么。
$countryGoup=array("USA","FRANCE","GERMANY","BRITAIN");
你可以:
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
并定义一个数据透视表,将您的主要对象(例如"用户")链接到国家/地区,从而建立多对多关系。
例如,users_countries
表将users
表链接到countries
表:
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 中没有"数组"数据类型,您必须使用一些解决方法。