source

데이터베이스 수준에서 쿼리를 통해 직렬화 해제

factcode 2022. 9. 15. 22:46
반응형

데이터베이스 수준에서 쿼리를 통해 직렬화 해제

데이터베이스에 다음과 같이 저장된 열 값이 있습니다.

a:2:{i:0;s:2:"";i:1;s:2:"19";}

php를 사용하는 대신 mysql 쿼리 중에 시리얼화를 해제하고 싶다.unserialize데이터를 가져온 후 작동합니다.이렇게 하면 일련화된 값을 사용하여 다른 테이블에 연결할 수 있습니다.이렇게 하면 조인된 데이터에 대해서만 php를 사용하여 시리얼을 해제한 후 별도의 쿼리를 실행할 필요가 없습니다.

MySQL은 PHP 직렬화가 무엇인지 인식하지 못합니다.넌 할 수 없어.

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;

참조를 위해 다음 사항을 확인하십시오.php를 사용하지 않고 mysql을 사용하여 데이터 직렬화를 해제하는 방법

이건 어때?이것은 내장 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';
+--------------+| 미시리얼화 |+--------------+| aaa |+--------------+1열 세트(0.00초)
drop function unserialize_php;

출처 : https://github.com/junamai2000/mysql_unserialize_php

MySQL 사용자 정의 함수를 만들고 호출할 수 있습니다.zend_eval_stringPHP 변수를 MySQL 결과로 되돌릴 수 있습니다.나는 샘플 프로그램을 구현했다.해봐도 돼.

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".*'

프로그래밍 언어 의존 구조를 데이터베이스에 추가하는 것은 매우 나쁜 관행입니다.그렇게 하면 항상 그 언어에 의존해야 합니다.

가장 좋은 방법은 정규화된 테이블 구조(다른 필드 또는 테이블)를 갖는 것입니다.

다음 방법은 데이터를 구분 문자열로 저장하는 것입니다(예: 0,US,1,19그럼 MySQL을 사용할 수 있습니다.SUBSTRING()또는 JSON 인코딩과 같은 표준 직렬화 메커니즘을 사용합니다.

kchteam에서 언급한 바와 같이 MySQL ToolBox 라이브러리는 커스텀 정의 MySQL 함수를 사용하여 이 용도로 유용합니다.getPhpSerializedArrayValueByKeyhttps://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

시리얼 어레이의 경우 여기서 getPhpSerializedArrayValueByKey 함수를 사용할 수 있습니다.

이렇게 간단하게 테이블에 앉을 수 있습니다.

    SELECT 
    table_to_join.ID as 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 ,';.') ;

언급하다.표에서 0부터 9까지의 인덱스를 사용합니다.다른 인덱스가 있는 경우 regexp를 수정해야 합니다.

언급URL : https://stackoverflow.com/questions/5335970/unserialize-through-query-at-database-level-itself

반응형