Polskie literki w wyszukiwaniu na hostingu

Myślałem, że nigdy nie napiszę pytania o polskie literki, a jednak :frowning:
Aplikacja działa poprawnie, wszystkie polskie literki się zapisują, odczytują wzdłuż i wszerz, oprócz…
Ano właśnie.
To działa bez pudła:

params[:query]="Łabądź" #tak przylatuje z formularza conditions=["name LIKE ? ", "%#{params[:query]}%"] @customers=Customer.paginate(:conditions => conditions, :page => params[:page])
Ale to niestety nie, ale tylko u dostawcy hostingowego, lokalnie działa:

params[:query]="Łabądź" #tak przylatuje z formularza sql="SELECT invoices.* FROM invoices LEFT JOIN customers on invoices.customer_id=customers.id WHERE customer.name LIKE '%#{params[:query}%' OR customer.first_name LIKE '%#{params[:query}%'" @invoices=Invoice.paginate_by_sql(sql, :page => params[:page])
Passenger wyrzuca taki błąd:
ActiveRecord::StatementInvalid (Mysql::Error: Illegal mix of collations for operation ‘like’: …i_tu_zawartość_zmiennej_sql…

Pomyślałem, że to może jakiś błąd MySql, więc otwieram phpmyadmin na tym serwerze, kopiuję zawartość sql żywcem z wywalanego błędu, odpalam sql i… wszystko działa, i to z tymi polskimi literami! Zbaraniałem i po pół dniu guglowania piszę tego posta w nadziei, że może ktoś pomoże.

Dodam jeszcze, że bez polskich liter wszystko działa bez pudła.

Pozdrawiam
Edwin Piekart

pierwsze co mi się rzuciło w oczy:
zainteresuj się meta_where i pozbądź się tych paskudnych konstrukcji z sqlem :wink:

@edwin: masz źle ustawione wartości dla zmiennych “collate_*” dla połączenia/bazy vs. dla tabeli.

w konsoli mysql:

show variables like ‘collat%’;

show create table invoices;

show create table customers;

i wklej to co zwróci tu na forum.

[quote=krzyzak]pierwsze co mi się rzuciło w oczy:
zainteresuj się meta_where i pozbądź się tych paskudnych konstrukcji z sqlem ;)[/quote]
Czy ja wiem? Jakoś nie widzę żeby w tym wypadku było przejrzyściej.

Edwin, czytelniej byłoby tak:

params[:query]="Łabądź" #tak przylatuje z formularza Invoice.paginate(:include => :customer, :conditions => ["customer.name LIKE ? OR customer.first_name LIKE ?", "%#{params[:query]}%", "%#{params[:query]}%", :page => params[:page])
Swoją drogą zamiast customer powinieneś używać liczby mnogiej customers.

Masz skopane collate w MySQL możesz ustawić je per połączenie, per tabelka i nawet per kolumna. Upewnij się że wszsytkie się zgadzają.

Dziękuję wszystkim za odpowiedzi.
Można powiedzieć, że wszyscy mieli rację, włącznie z serwerem :slight_smile:

Rzecz wymaga jednak komentarza.
Kiedy już sprawdziłem wszystko co hosiawak proponował i konfiguracja była jak najbardziej prawidłowa opadły mi trochę ręce. Miałem nadzieję z tym collate.
Spróbowałem więc tego co mi radarek polecał aby, górnolotnie mówiąc, kod uczynić piękniejszym i oczywiście mniej podatnym na błędy :-). Jako, że nie chciało mi się pisać całego zapytania na raz, to wypróbowałem tylko kawałek i zadziałało bez pudła. Nie będę tu pisał epistoły więc przejdę do sedna!

Wśród pól do przeszukania, oprócz pól typu string było jedno typu integer. Wiadomo, że dla takiego typu mysql nie ustawia collate, ale standardowy sql LIKE działa jak najbardziej. Dopiero, gdy przylatywał tam polski znaczek mysql podnosił rączki.

Dziękuję wszystkim jeszcze raz za pomoc
Edwin Piekart