데이터베이스 수준에서 쿼리를 통해 직렬화 해제
데이터베이스에 다음과 같이 저장된 열 값이 있습니다.
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_string
PHP 변수를 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 함수를 사용하여 이 용도로 유용합니다.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
시리얼 어레이의 경우 여기서 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
'source' 카테고리의 다른 글
jQuery를 사용하여 HTML 요소가 비어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2022.09.15 |
---|---|
잭슨 주석을 사용하여 중첩된 값을 속성에 매핑하려면 어떻게 해야 합니까? (0) | 2022.09.15 |
.hprof 파일을 분석하려면 어떻게 해야 하나요? (0) | 2022.09.15 |
정수를 수천 개의 쉼표로 문자열로 변환 (0) | 2022.09.15 |
sql 키워드 'like'를 사용하여 암호화된 데이터를 검색하는 방법 (0) | 2022.09.15 |