Dotaz s hlavičkami e-mailů ze speciální znaky v latince odmítnut PHP mysqli_query a MariaDB příkazové řádce, pracuje v HeidiSQL

0

Otázka

Narazil jsem na situaci, kdy e-mail od někoho, v Evropě se stále nedaří spustit. Po minimalizaci dotazu jsem se rozhodl, že po všechny speciální znaky, jako å a é jsou odstraněny dotaz, funguje v PHP / mysqli_query. Dotazy také nefungují v MariaDB příkazové řádky i když dělat práci v HeidiSQL, jsem si představit, co HeidiSQL používá interně upravuje řetězce použité v Dotazu karet.

Pojďme následující:

  • Databáze Znaková Sada: utf8mb4.
  • Databáze Kolace: utf8mb4_unicode_520_ci.
  • Databáze sloupec řazení: utf8mb4_unicode_520_ci.
  • Správný dotaz pro žádost metoda SET CHARACTER SET 'utf8mb4' je správně proveden.

Zde je dotaz:

 INSERT IGNORE INTO example_table (example_column) VALUES ('Håko');

Musím poznamenat, že jsem se snažil následující (který také selhal), i když pevně věřím, že k tomuto problému dochází z a by měly být vyřešeny prostřednictvím PHP:

 INSERT IGNORE INTO example_table (example_column) VALUES (CONVERT('Håko' USING utf8));

Zde je MariaDB chyba:

Incorrect string value: '\xE9rard ...'

Jak jsem řekl, tento řetězec je původem z e-mailové zprávy, takže jsem si jistý, že je problém s PHP, ne MariaDB. Tak ať to jít pozpátku , aby ten kód že vypadá jinak pracovat. Prosím, mějte na paměti, že to má brát alespoň dva dny dát dohromady ve správném pořadí, aby i ten řetězce se zobrazí správně v MariaDB protokolu dotazu, aniž by byl nesprávně převedeny na UTF-8 a poškození speciální znaky v latince:

<?php
$s1 = '=?iso-8859-1?Q?=22G=E9rd_Tabt=22?= <[email protected]>';//"Gérd Tabt" <[email protected]>

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;}
?>

Není žádné jiné relevantní kód zpracování této hlavičky řetězec.

Co je příčinou, co jsem předpokládat, že je zakódován v UTF-8 řetězce rozbít PHP mysqli_query a MariaDB příkazové řádky, z práce s tímto dotazem?

heidisql mariadb php
2021-11-22 16:30:52
1

Nejlepší odpověď

0

Kde se šestihrannou E9 pocházejí z? To je kódován latin1. Přesto konfiguraci, zdá se, tvrdí, že váš klient je kódován utf8mb4. Ty musí mít připojení charset zápas, jaké kódování je na klienta. Databáze a tabulky a klient může mít jiné kódování; MariaDB je šťastný převést na létat když INSERTing nebo SELECTing.

Pro podrobnější analýzu, viz Problémy s UTF-8 znaků; to, co vidím, není to, co mám uložené

2021-11-28 07:45:41

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................