Illegal mix of collation (IMPLICIT, COERCIBLE)
- Kamil Valenta
- Člen | 832
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 | 1296
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 | 1296
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 | 1296
Nevím co je to <binary>
, asi by bylo dobré zjistit kde
se to tam bere.
- Marek Bartoš
- Nette Blogger | 1296
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 | 832
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
$search
dumpni (bdump
do 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 | 1296
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