Sortowanie i polskie znaki (żeby 'ą' była za 'a')

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?

czesc

  1. ustaw w database.yml
    encoding: utf8

  2. sprawdz dokladnie w bazie czy masz ustawione uft8 i collation uft8_polish_ci

  3. 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)

No a potem według instrukcji Tusly :slight_smile:

    • collation, a nie dinner :wink:

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! :slight_smile:

(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

Jak zakładać bazę z utf8 i utf8_polish_ci?

Czyżby to był bug (http://dev.rubyonrails.org/ticket/11331)? Ale mam najnowszą wersję RoR.

Edit: Dobra, widzę, że chodzi po prostu o moment zakładania bazy:

CREATE DATABASE myjewels CHARACTER SET utf8 COLLATE utf8_polish_ci; 

Powoduje, że rake db:migrate tworzy tabele i kolumny takie jak trzeba, natomiast samo:

CREATE DATABASE myjewels; powoduje sytuację opisaną przeze mnie wyżej.

Dzięki :slight_smile:

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.

Bober, gdzie tu widzisz “jazdy z kodowaniem w MySQLu”? Raz ustawił kolację i gra, ciężko to nazwać “jazdą”.

Tomash, ja często miałem, zawsze przy przenoszeniu na nowy serwer. A w Postgresie nie musisz niczego ustawiać. Polecam!