MySQL이 허용된 제한보다 짧은 쿼리로 max_allowed_packet 위반에 대해 불만을 제기함
다중 삽입 쿼리를 실행하면 "SQLSTATE[08S01]:통신 링크 장애: 1153 'max_allowed_packet' 바이트보다 큰 패킷을 받았습니다.여러 개의 삽입 쿼리를 구성하여 제한을 철저히 확인하는 복잡한 클래스가 있기 때문에 매우 이상하지만, 우리는 모두 인간이기 때문에 문제를 찾으려는 몇 가지 시도 후 예외 세부 정보를 기록했을 뿐이며, 무엇이 진행 중인지 알 수 없습니다.코드(PHP 7.4, PDO, MariaDB 10.5.10):
$this->pdoInstance = sql_get_connect($this->connection);
$stmt = $this->pdoInstance->query("show variables like 'max_allowed_packet'");
$d = sql_fetch($stmt);
$stmt->closeCursor();
$this->max_size = (int) $d['Value'];
...
try {
$stmt = $this->pdoInstance->query($query);
} catch (CDbException $e) {
if (strpos($e->getMessage(), 'max_allowed_packet') !== false) {
log ([
'total_size' => strlen($query),
'max_size' => $this->max_size,
];
}
throw $e;
}
그리고 내가 얻는 것은:
total_size => 33554425
max_size => 33554432
그래서 보내는 쿼리는 실제로 제한치보다 7바이트 적습니다.하지만 문제는 안정적으로 재현되고 있습니다.뭐가 원인이죠?아마도 쿼리나 다른 것과 함께 보낸 헤더가 있을 것입니다만, 그 사이즈는 어떻게 확인할 수 있을까요?MySQL에서도 MariaDB 문서에서도 찾을 수 없었습니다.
strlen()
는 1자가 1바이트라고 가정하기 때문에 멀티바이트 문자를 올바르게 처리하지 않습니다.이것은 단순히 Unicode에서는 무효입니다.
사용해보십시오.mb_strlen()
대신 기능합니다(mb는 멀티바이트를 나타냅니다).
음, 문제는 아주 간단해 보였어요.PDO 쿼리 실행을 방해하는 PHP Extension이 앱 서버에 설치되어 있으며, 여기에 특별한 설명을 추가합니다.복잡한 침입 탐지 시스템의 일부이지만 쿼리 길이에 영향을 미친다는 것은 문서화되어 있지 않습니다.이제 알았습니다.
방해해서 미안하고 도와주려고 한 모두에게 고마워!
언급URL : https://stackoverflow.com/questions/69289264/mysql-complains-about-max-allowed-packet-violation-with-query-shorter-than-the-a
'programing' 카테고리의 다른 글
개체 키 배열 가져오기 (0) | 2022.09.25 |
---|---|
java.sql ?에 해당하는 날짜/시간(java.sql.datetime이 있습니까?) (0) | 2022.09.25 |
nodejs를 사용하여 Inmariadb를 일괄 삽입하는 방법은 무엇입니까? (0) | 2022.09.24 |
PHP에서 어레이 값을 소문자로 변환하는 방법 (0) | 2022.09.24 |
PHP에서 echo 내에 줄 바꿈을 추가하는 방법은 무엇입니까? (0) | 2022.09.24 |