我有一个列值存储在数据库中:
一个:2:{I:0; S:2: “US”; I:1; S:2: “19”;}
我想在mysql查询期间反序列化它,而不是在获取数据后使用php unserialize
函数。
我想这样做,所以我可以使用序列化值加入另一个表。这将避免在使用php反序列化后执行单独的查询,仅用于连接数据。
答案 0 :(得分:56)
MySQL不知道PHP序列化是什么。你不能这样做。
答案 1 :(得分:29)
您可以使用SUBSTRING_INDEX
例如,如果您有这样的记录:
a:5:{s:9:"invoiceid";s:1:"8";s:8:"balance";i:5;s:14:"broughtforward";i:3;s:6:"userid";s:5:"13908";s:10:"customerid";s:1:"3";}
您可以使用以下SELECT语句:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',1),':',-1) AS fieldname1,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',2),':',-1) AS fieldvalue1,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',3),':',-1) AS fieldname2,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',4),':',-1) AS fieldvalue2,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',5),':',-1) AS fieldname3,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',6),':',-1) AS fieldvalue3,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',7),':',-1) AS fieldname4,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',8),':',-1) AS fieldvalue4,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',9),':',-1) AS fieldname5,
SUBSTRING_INDEX(SUBSTRING_INDEX(old_data,';',10),':',-1) AS fieldvalue5
FROM table;
选中此项以供参考:How to unserialize data using mysql without using php
答案 2 :(得分:13)
这个怎么样?这是一个嵌入了php的MySQL用户定义函数:
CREATE FUNCTION unserialize_php RETURNS STRING SONAME 'unserialize_php.so';
用法示例:
SELECT unserialize_php('O:8:"stdClass":2:{s:1:"a";s:4:"aaaa";s:1:"b";s:4:"bbbb";}', "$obj->a")
AS 'unserialized';
+--------------+ | unserialized | +--------------+ | aaaa | +--------------+ 1 row in set (0.00 sec)
drop function unserialize_php;
来源:https://github.com/junamai2000/mysql_unserialize_php
您可以创建MySQL用户定义的函数并在函数内部调用zend_eval_string
,以便将PHP变量带回MySQL结果。我实施了一个示例程序。你可以尝试一下。
答案 3 :(得分:9)
来自http://www.blastar.biz/2013/11/28/how-to-use-mysql-to-search-in-php-serialized-fields/
标准数组
SELECT * FROM table WHERE your_field_here REGEXP '.*;s:[0-9]+:"your_value_here".*'
关联数组
SELECT * FROM table WHERE your_field_here REGEXP '.*"array_key_here";s [0-9]+:"your_value_here".*'
答案 4 :(得分:8)
将编程语言相关结构添加到数据库是一种非常糟糕的做法。如果你这样做,你总是要依赖那种语言。
最好的方法是使用规范化的表结构(不同的字段或表)。
下一种方法是将数据保存为分隔字符串(例如:0,US,1,19
)。然后,您可以使用MySQL的SUBSTRING()
或使用标准的序列化机制,如JSON编码。
答案 5 :(得分:6)
正如kchteam所提到的,MySQLToolBox库可以方便地使用自定义的MySQL函数getPhpSerializedArrayValueByKey
https://github.com/KredytyChwilowki/MySQLToolBox/blob/master/getPhpSerializedArrayValueByKey.sql来实现此目的。
添加此函数后,您可以使用以下语法
检索序列化数组中的任何值SELECT getPhpSerializedArrayValueByKey(column_name, 'array_key') AS deseializedArrayValue FROM table_name
给定的数组可以像
一样反序列化SELECT getPhpSerializedArrayValueByKey('a:2:{i:0;s:2:"US";i:1;s:2:"19";}
', 'key_to_retrieve') AS key_to_retrieve
答案 6 :(得分:0)
对于序列化数组您可以使用here中的函数getPhpSerializedArrayValueByKey
答案 7 :(得分:0)
您可以简单地以这种方式加入您的表格


 SELECT
 table_to_join.ID为table_to_join_ID,
 serialized_table.ID AS serialized_table_ID,
 FROM
 table_to_join
 LEFT JOIN
 serialized_table ON serialized_table.array_field REGEXP CONCAT_WS('','。s:[0-9]; s:',table_to_join.ID,';。');

&#xA ;
 请注意。我在表中使用0到9的索引。如果您有其他索引,则必须更正regexp