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?