Illegal mix of collation (IMPLICIT, COERCIBLE)

- Kamil Valenta
- Člen | 846
Nevstupuje do dotazu nějaký parametr z URL? Zdrojem utf8mb4 bývají často emotikony, které se do URL dostanou zejména na mobilech omylem…

- ForestCZE
- Člen | 209
Kamil Valenta napsal(a):
Nevstupuje do dotazu nějaký parametr z URL? Zdrojem utf8mb4 bývají často emotikony, které se do URL dostanou zejména na mobilech omylem…
@KamilValenta url vypadá takto:
?emsid=c1b1f435f801e93ca56b9e044a73e389fd9cf145&search=václav
a není to z telefonu

- Marek Bartoš
- Nette Blogger | 1313
Určitě je dobré collation změnit. Mysql neaktualizuje automaticky, které
znaky můžeš použít a databáze ti na nich prostě spadne. utf8 v mysql
nezvládá ani emoji.
Momentálně nejposlednější je utf8mb4_0900_ai_ci – Unicode
9.0.0, accent insensitive, case insensitive
https://mysqlserverteam.com/…mysql-8-0-0/
Problém máš zvláštní, o tom že by mysql na výstupu funkce mělo jiné collate než na vstupu jsem neslyšel a imho by tvůj problém neměl nastat, když máš všude stejné collations. Pokud by ti ale změna nepomohla, tak collation lze nastavit i pro sql statement https://dev.mysql.com/…collate.html

- Marek Bartoš
- Nette Blogger | 1313
Obecný utf8mb4_0900_ai_ci by měl myslím stačit (české
znaky řeší to ai – accent insensitive), ale přímo pro
češtinu je utf8mb4_cs_0900_ai_ci
Editoval Marek Bartoš (29. 8. 2021 23:31)

- ForestCZE
- Člen | 209
@MarekBartoš Aktualizoval jsem celý Wampserver, abych tam to kódování vůbec měl. Error to sice nehází, ale query mi ten záznam nenajde. Tracy mi hází:
SELECT `id`
FROM `ems_employees`
WHERE (LOWER(`lastname`) LIKE <binary> OR LOWER(`firstname`) LIKE <binary>)
ORDER BY `job_grade` DESC

- Marek Bartoš
- Nette Blogger | 1313
Nevím co je to <binary>, asi by bylo dobré zjistit kde
se to tam bere.

- Marek Bartoš
- Nette Blogger | 1313
V zobrazeném dotazu je <binary>, když jsou ve stringu nějaké ze
znaků kontrolovaných v preg_match. Nejspíš ti porovnávání nefunguje
podle očekávání kvůli nim. A taky se ti proto použilo
utf8mb4_general_ci
https://github.com/…/Helpers.php#…
Editoval Marek Bartoš (30. 8. 2021 12:11)

- ForestCZE
- Člen | 209
Marek Bartoš napsal(a):
V zobrazeném dotazu je <binary>, když jsou ve stringu nějaké ze znaků kontrolovaných v preg_match. Nejspíš ti porovnávání nefunguje podle očekávání kvůli nim. A taky se ti proto použilo
utf8mb4_general_ci
https://github.com/…/Helpers.php#…
@MarekBartoš Rozumím, ale posílám tam pouze nějaké jméno z
<input type="text">, které obsahuje české znaky.
Takže ani teď netuším, co je špatně. Byla by možnost se nějak spojit, abychom se na to podívali? Já vážně nevím, co s tím mám dělat, bohužel.
EDIT: Žádný z těch znaků tam není.
Editoval ForestCZE (30. 8. 2021 12:30)

- Kamil Valenta
- Člen | 846
Do toho dotazu přece vstupuje nějaký argument. Někde získáváš jeho
hodnotu.
Budeš muset ukázat více kódu. Jak přesně ten dotaz skládáš, jak bereš
hodnotu parametru, atp.

- ForestCZE
- Člen | 209
Kamil Valenta napsal(a):
Do toho dotazu přece vstupuje nějaký argument. Někde získáváš jeho hodnotu.
Budeš muset ukázat více kódu. Jak přesně ten dotaz skládáš, jak bereš hodnotu parametru, atp.
@KamilValenta
Model:
**
* Gets patients
* @param string|null $search
* @return array
*/
public function getPatients(?string $search): array
{
if(!$search)
return $this->database->getPatients()->order('id DESC')->limit(20)->fetchAll();
else
{
$s = explode(" ", $search);
if(count($s) == 1)
return $this->database->getPatients()->where('LOWER(lastname) LIKE ? OR LOWER(firstname) LIKE ? OR phone_number LIKE ?', '%' . strtolower($s[0]) . '%', '%' . strtolower($s[0]) . '%', '%' . $s[0] . '%')->order('id DESC')->fetchAll();
else
return $this->database->getPatients()->where('(LOWER(lastname) LIKE ? AND LOWER(firstname) LIKE ?) OR (LOWER(lastname) LIKE ? AND LOWER(firstname) LIKE ?)', '%' . strtolower($s[0]) . '%', '%' . strtolower($s[1]) . '%', '%' . strtolower($s[1]) . '%', '%' . strtolower($s[0]) . '%')->order('id DESC')->fetchAll();
}
}
Presenter:
public function actionCardFile($search): void
{
$this->patients = $this->hospital->getPatients($search);
}
URL:
...?emsid=c1b1f435f801e93ca56b9e044a73e389fd9cf145&search=lakato%C5%A1
Více toho není.
Editoval ForestCZE (30. 8. 2021 13:31)

- ForestCZE
- Člen | 209
Šaman napsal(a):
Tak si ještě ten
$searchdumpni (bdumpdo panelu) ať vidíš, co skutečně posíláš do dotazu.
@Šaman tak ale teď jsem z toho jelen. Teď jsem otevřel Wamp, že to testnu a printnu a najednou to funguje…
PS. Jaké použít collation, pokud starší verze mysql nemá
utf8mb4_0900_ai_ci?

- Marek Bartoš
- Nette Blogger | 1313
PS. Jaké použít collation, pokud starší verze mysql nemá utf8mb4_0900_ai_ci?
Prakticky cokoli co začíná na utf8mb4.
utf8mb4_unicode_520_ci nebo alespoň
utf8mb4_unicode_ci by mělo být dostupné na snad každé
používané verzi mysql