PHP mysqli_query 및 MariaDB 명령줄에서 거부된 특수 라틴 문자의 전자 메일 헤더를 사용한 쿼리는 HeyidSQL에서 작동합니다.
유럽에 있는 누군가의 이메일이 계속 실행되지 않는 시나리오를 경험했습니다.질문을 최소화한 후에 저는 모든 특별한 캐릭터들이 다음과 같이 한다는 것을 결정했습니다.å
그리고.é
제거되었습니다. 쿼리는 PHP에서 잘 작동합니다.mysqli_query
쿼리는 또한 HeyidiSQL에서 작동하지만 MariaDB의 명령줄에서 작동하지 않습니다. HeyidiSQL이 내부적으로 사용하는 것이 무엇이든 쿼리 탭에서 사용되는 문자열을 조정한다고 생각합니다.
다음과 같은 문제를 해결해 보겠습니다.
- 데이터베이스 문자 집합:
utf8mb4
. - 데이터베이스 정렬:
utf8mb4_unicode_520_ci
. - 데이터베이스 열 조합:
utf8mb4_unicode_520_ci
. - 요청 메서드에 대한 올바른 쿼리
SET CHARACTER SET 'utf8mb4'
올바르게 실행되고 있습니다.
다음은 질문입니다.
INSERT INTO example_table (example_column) VALUES ('Håko');
저는 이 문제가 PHP에서 발생하고 PHP를 통해 해결되어야 한다고 굳게 믿고 있음에도 불구하고 다음을 시도했습니다(또한 실패했습니다).
INSERT INTO example_table (example_column) VALUES (CONVERT('Håko' USING utf8));
다음은 MariaDB 오류입니다.
잘못된 문자열 값: '\xE9rard...'
제가 말씀드린 것처럼 이 문자열은 이메일 메시지에서 비롯된 것이므로 MariaDB가 아닌 PHP에 문제가 있다고 확신합니다.이제 거꾸로 돌아가 봅시다. 작동하지 않는 것처럼 보이는 코드입니다.UTF-8로 잘못 변환되지 않고 특수 라틴 문자가 손상되지 않고 MariaDB 쿼리 로그에 문자열이 올바르게 표시되도록 하려면 이 작업이 올바른 순서로 구성되는 데 최소 이틀이 걸렸습니다.
<?php
$s1 = '=?iso-8859-1?Q?=22G=E9rd_Tabt=22?= <berbs@example.com>';//"Gérd Tabt" <berbs@example.com>
if (strlen($s1) > 0)
{
if (substr_count($s1, '=?') && substr_count($s1, '?= '))
{
$p = explode('?= ', $s1);
$p[0] = $p[0].'?=';
$s2 = imap_mime_header_decode($p[0])[0]->text.' '.$p[1];
}
else {$s2 = imap_mime_header_decode($s1)[0]->text;}
if (strpos($s1, '=96') !== false) {$s2 = mb_convert_encoding($s2, 'UTF-8', 'CP1252');}
else if (mb_convert_encoding($s2, 'UTF-8') == substr_count($s1, '?')) {$s2 = mb_convert_encoding($s2, 'UTF-8');}
}
else {$s2 = $s1;}
?>
이 헤더 문자열을 처리하는 다른 관련 코드가 없습니다.
무엇이 내가 UTF-8 인코딩 문자열로 추정하여 PHP의 문자열을 깨트리는 원인입니다.mysqli_query
그리고 이 쿼리로 작업하는 MariaDB 명령줄은 무엇입니까?
E9 육각형은 어디서 왔습니까?그것은 latin1로 인코딩되었습니다.하지만 당신의 구성은 당신의 클라이언트가 utf8mb4로 인코딩되었다고 주장하는 것 같습니다.클라이언트의 인코딩과 일치하는 연결 문자 집합이 있어야 합니다.데이터베이스, 테이블 및 클라이언트는 다른 인코딩을 가질 수 있습니다. MariaDB는 다음과 같은 경우 즉시 변환할 수 있습니다.INSERTing
또는SELECTing
.
자세한 분석은 UTF-8 문자 문제를 참조하십시오. 저장한 내용이 아닙니다.
-
if (mb_convert_encoding($s2, 'UTF-8') == substr_count($s1, '?'))
이것은 말이 안 됩니다. 문자열(모든 문자열에서 UTF-8로 변환됨)을 정수(일치량)와 비교하는 것은 변환된 텍스트가 다음과 같을 때만 동일합니다.
'0'
는 견의양이합니다도기발을 찾는 .'?'
하지 않은 매개변수 해당 매개변수를 할 수 있습니다.==
이것이 유일한 시나리오입니다.'0'
0
.따라서 텍스트는 UTF-8로 변환되지 않고 원래의 텍스트(이 경우 ISO-8859-1)로 유지됩니다.
-
mb_convert_encoding($s2, 'UTF-8')
소스 인코딩을 알리지 않고 UTF-8로 변환하시겠습니까?
ISO-8859-1
이메일 헤더만 기대할 수 있는 것은 아닙니다. 해당 정보를 추출하여 기능에 전달하는 것은 어떻습니까?
MariaDB가 맞습니다. 당신은 그런 경우 ISO-8859-1 인코딩된 텍스트를 넘겨주는 반면 DBMS는 UTF-8 인코딩을 기대합니다.
언급URL : https://stackoverflow.com/questions/70069175/query-with-email-headers-from-special-latin-characters-rejected-by-php-mysqli-qu
'source' 카테고리의 다른 글
JSON.parse()가 작동하지 않습니다. (0) | 2023.09.04 |
---|---|
파워셸 최대/첫 번째/두 번째 기능 (0) | 2023.09.04 |
jQuery append() vs appendChild() (0) | 2023.09.04 |
DataTables agax.reload()의 페이지 손실 (0) | 2023.09.04 |
예기치 않은 기호 'NONE' 아카이브 엔진 - MariaDB DBForge (0) | 2023.09.04 |