Illegal mix of collation (IMPLICIT, COERCIBLE)

ForestCZE
Člen | 209
+
0
-

Ahoj, řeším stejný problém jako zde před 5 lety, ale bohužel žádná odpověď.

Mám tento error. Všechny moje tabulky i sloupce mají utf8_czech_ci. Netuším, kde se bere utf8mb4_general_ci a proč. Má s tím někdo zkušenost? Díky.

Kamil Valenta
Člen | 758
+
0
-

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
+
0
-

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 | 1166
+
0
-

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

ForestCZE
Člen | 209
+
0
-

@MarekBartoš A na jaké konkrétně to mám změnit? Když změním vše např. na utf8mb4_general_ci, tak error sice nemám, ale nevezme to české znaky, toho člověka to nenajde jako by tam nebyl a v dotazu v tracy je v parametru <binary>

Marek Bartoš
Nette Blogger | 1166
+
0
-

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
+
0
-

@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 | 1166
+
0
-

Nevím co je to <binary>, asi by bylo dobré zjistit kde se to tam bere.

ForestCZE
Člen | 209
+
0
-

Marek Bartoš napsal(a):

Nevím co je to <binary>, asi by bylo dobré zjistit kde se to tam bere.

No já bych rád, ale netuším, jak to zjistit.

Marek Bartoš
Nette Blogger | 1166
+
0
-

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
+
0
-

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 | 758
+
0
-

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
+
0
-

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)

Šaman
Člen | 2634
+
0
-

Tak si ještě ten $search dumpni (bdump do panelu) ať vidíš, co skutečně posíláš do dotazu.

Editoval Šaman (30. 8. 2021 19:35)

ForestCZE
Člen | 209
+
0
-

Š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 | 1166
+
0
-

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

ForestCZE
Člen | 209
+
0
-

@MarekBartoš @Šaman tak to byla asi jenom náhoda nebo jako já už fakt nevím, co je špatně. Výsledek zde.