Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ograniczony wynik zapytania do 1024znaków (?)
Forum PHP.pl > Forum > Bazy danych > MySQL
Jarod
Trafiłem dzisiaj na dosyć dziwny przypadek.

Mam takie zapytanie:
  1. SELECT group_name, group_description, GROUP_CONCAT(role_name, \' (', role_description, ')' SEPARATOR '|') As roles FROM groups LEFT JOIN groups_roles USING(group_id) LEFT JOIN roles USING(role_id) GROUP BY group_name\G



Przykładowy wynik:
Cytat
group_name - Administratorzy
group_description - Administratorzy systemu
roles - ChangeLogView (Przeglądanie changeloga)|ListOfUsers (Przeglądanie listy użytkowników)|AddUser (Dodawanie użytkownika)|SearchUser (Szukanie użytkownika)|AddUserToGroup (Dodawanie użytkownika do grupy)|AddRoleToGroup (Dodawanie roli do grupy)|DeleteUserFromGroup (Usuwanie użytkownika z grupy)|DeleteRoleFromGroup (Usuwanie roli z grupy)|LogsView (Przeglądanie logów)|EventsView (Przeglądanie zdarzeń)|(...)|AddL



Problem w tym, że roles jest obcinane do 1024 znaków. Ucina na AddL a powinno być jeszcze sporo innych ról. To jakieś ograniczenie Mysqla?questionmark.gif
sf
Tyle ustawiłeś znaków na kolumnę to tyle jest. Spójrz na strukturę tabeli.
Jarod
Cytat(sf @ 5.08.2007, 18:45:39 ) *
Tyle ustawiłeś znaków na kolumnę to tyle jest. Spójrz na strukturę tabeli.

Przecież to nie ma znaczenia, bo łącze stringi za pomocą GROUP_CONCAT(). Spójrz jeszcze raz na kwerende. Struktura tabeli roles:


Kod
mysql> describe roles;
+------------------+-------------+------+-----+---------+----------------+
| Field            | Type        | Null | Key | Default | Extra          |
+------------------+-------------+------+-----+---------+----------------+
| role_id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| role_name        | varchar(30) | NO   | UNI |         |                |
| role_description | varchar(60) | NO   |     |         |                |
+------------------+-------------+------+-----+---------+----------------+



Wygląda na to jakby wynik zwracany przez funkcję GROUP_CONCAT() był ograniczony do 1024znaków.

EDIT: Tak myślałem.. Z manuala:
Cytat
The result is truncated to the maximum length that is given by the group_concat_max_len system variable, which has a default value of 1024. The value can be set higher, although the maximum effective length of the return value is constrained by the value of max_allowed_packet. The syntax to change the value of group_concat_max_len at runtime is as follows, where val is an unsigned integer:

SET [SESSION | GLOBAL] group_concat_max_len = val;

Beginning with MySQL 5.0.19, the type returned by GROUP_CONCAT() is always VARCHAR unless group_concat_max_len is greater than 512, in which case, it returns a BLOB. (Previously, it returned a BLOB with group_concat_max_len greater than 512 only if the query included an ORDER BY clause.)


Są 2 rozwiązania:
1. Ustawiać za każdym razem (bałbym się stosować global) przy próbie pobrania tych danych
SET SESSION group_concat_max_len = nasza_wartość;
2. Wykorzystać tymczasową tabelę



Które rozwiązanie jest lepsze (Waszym zdaniem)?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.