Zapewne wielu z Was spotkało się z problemem sortowania polskich znaków podczas pobierania danych z bazy, szczególnie gdy mamy ustawione porównywanie znaków na utf8_general_ci. Sztandarowym przykładem może być tutaj lista województw, gdzie standardowo województwo łódzkie będziemy mieli na samym końcu.

Rozwiązaniem tego problemu jest wskazanie zestawu znaków dla określonej kolumny, którą wskażemy w sekcji ORDER BY zapytania, czyli:

SELECT wojewodztwo FROM tablica_wojewodztw ORDER BY wojewodztwo COLLATE utf8_polish_ci ASC

Wszystko wydaje się dość proste do chwili, gdy chcemy to zaimplementować w Zend Frameworku.
Mamy poniższy kod, który pobiera nam dane z tabeli tablica_wojewodztw:

$table = new VoivodeshipTable();

$select = $table->select();
$select->order( 'wojewodztwo ASC' );
$result = $table->fetchAll();

Pierwsze co przychodzi do głowy to dodanie COLLATE jako parametr metody order:

$select->order( 'wojewodztwo COLLATE utf8_polish_ci ASC' );

Takie coś jednak nie przyniesie zamierzonego efektu, gdyż Zend Framework dość dobrze ogranicza wstrzykiwanie niedozwolonych wartości do obiektu Zend_Db_Select.

Rozwiązaniem jest tutaj zastosowanie klasy Zend_Db_Expr.

$table = new VoivodeshipTable();

$select = $table->select();

$orderByLocal = new Zend_Db_Expr( 'wojewodztwo COLLATE utf8_polish_ci ASC' );

$result = $table->fetchAll( $select, $orderByLocal );

Jak więc widzimy, za pomocą klasy Zend_Db_Expr tworzymy sekwencję dla sekcji ORDER BY i przekazujemy ją w metodzie fetchAll() jako parametr $order.

Zend_Db i sortowanie polskich znaków
Tagged on:                     

2 thoughts on “Zend_Db i sortowanie polskich znaków

  • 2012-04-05 at 15:12
    Permalink

    a nie prościej na tabeli ustawić porównywanie znaków na stałe, zamiast kazdy mrazem doklejać to do zapytania?

    Reply
  • 2012-04-05 at 15:25
    Permalink

    @aandrzej: No oczywiście, że prościej, ale czasami nie mamy takiej możliwości i trzeba się posiłkować opisanym rozwiązaniem.

    Reply

Leave a Reply to aandrzej Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Social Widgets powered by AB-WebLog.com.