Kiedy sortuję rekordy np. wg nazwisk, te zaczynające się od polskich znaków pojawiają się na końcu. Zarówno na stronie, jak i bezpośrednio w mysql.
Połączyłem się z bazą, wykonałem polecenia:
mysql> set character set utf8;
mysql> set names ‘utf8’ collate ‘utf8_polish_ci’;
W nagłówku strony mam:
rake db:charset zwraca mi latin1
W database.yml nie mam
encoding: utf8
ponieważ kiedy dodaję taką linijkę, literki się krzaczą. Any help?
sprawdz dokladnie w bazie czy masz ustawione uft8 i collation uft8_polish_ci
sprawdz czy plik (widok) odpowiedzialny za listing z bazy jest zapisany w utf8,
samo dodanie charset=UTF-8 do mety nie wystarcza
(np. zainstaluj sobie jedit’a i otworz w nim ten plik, jezeli nie jest w uft8, to zrob reload with encoding utf8, (menu->file))
Jeśli nie tworzyłeś od razu bazy i każdej z tabel z odpowiednim kodowaniem (w MySQL niestety ustawia się to często razem z kolacją*), to musisz teraz przeczołgać WSZYSTKIE tabele i wszystkie kolumny, nadając im odpowiedni atryubut (utf8_polish_ci).
(Najlepiej utworzyć nową bazę z tym kodowaniem i tą kolacją właśnie, ustawić je od razu jako domyślne, odpalić migracje i potem ewentualnie tylko zmigrować dane)
Okazało się, że dane do bazy były wprowadzane za pomocą widoku generowanego przez plik zakodowany w ISO-2. Teoretycznie wszystko mogłoby już działać, ponieważ polecenie
select nazwisko from users order by nazwisko collate utf8_polish_ci;
działa poprawnie. Niestety, nie udaje mi się zmienić NA STAŁE metody porównywania napisów (collate) - ani w bazie na serwerze, ani w bazie na localhoście. Polecenie
alter table users default character set utf8 collate utf8_polish_ci;
nie zmienia nic ani tu, ani tu. Czy ktoś mógłby powiedzieć, jak to zmienić na stałe?
development:
adapter: mysql
encoding: utf8
database: informator_development
pool: 5
username: root
password:
collation: utf8_polish_ci
host: localhost
tak sobie ustawiam na starcie, nie wiem czy dobrze, ale działa
Okej, więc już działa. Ogólnie rzecz biorąc wszystko sprowadzało się do założenia odpowiedniego collation na odpowiednich KOLUMNACH. Zmiana collation w całej bazie jak i w tabelach nic nie dawała, a cały czas ograniczałem się tylko do tego. Polecenie, którym można zmienić collation dla poszczególnych kolumn to (przykładowo):
alter table users change imie imie varchar(255) collate utf8_polish_ci;
Ja potrzebowałem tylko porównywania nazwisk i imion, więc sprowadzało się to do wydania dwóch poleceń; jeśli ktoś ma więcej takich kolumn i tabel, przerabianie ich może być czasochłonne, ale w sieci można znaleźć skrypty, które robią to za nas.
Dodanie collation w database.yml również nic nie dało.
Oczywiście, czytałem, tyle że w sieci znalazłem sporo różnych poleceń dotyczących zmiany kolacji dla tabel, ale dopiero dzisiaj znalazłem takie, które zadziałało:
alter table users convert to character set utf8 collate utf8_polish_ci;
Zdaje się, że zniechęcony ich niedziałaniem nie spróbowałem zmienić kolacji dla pojedynczych kolumn. Inna sprawa, że kiedy już ustawiłem kolację dla kolumny ‘nazwisko’, cała reszta nie miała znaczenia (tabela była w utf8_general_ci, a i tak działało). Wielkie dzięki za pomoc!
(Najlepiej utworzyć nową bazę z tym kodowaniem i tą kolacją właśnie, ustawić je od razu jako domyślne, odpalić migracje i potem ewentualnie tylko zmigrować dane)[/quote]
A jak to zrobić? Mam w database.yml:
development:
adapter: mysql
database: myjewels
username: zuzka
password: moje_haslo_tutaj
encoding: utf8
collation: utf8_polish_ci
pool: 5
timeout: 5000
Ale po rake db:migrate dostaje wszystko w:
Character Set: cp1252 West European
Collation: latin1_swedish_ci
możesz też przerzucić sie na Postgresa gdzie oprócz szeregu innych zalet nie ma dziwnych jazd z kodowaniem tak jak w mysqlu, raz zadeklarujesz utf8 i potem już tak śmiga.