Operator UNION - konkatenacja i złączenie lewostronne

Użytkowanie programu bazodanowego
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Operator UNION - konkatenacja i złączenie lewostronne

Post autor: czp »

Witam.

Opisana w poprzednim poście podwójna konkatenacja, jest mi potrzebna jako zagnieżdżone zapytanie czy też podzapytanie zapytania głównego. Całość w miarę poprawnie opracowałem przy zastosowaniu złączenia lewostronnego i operatora UNION, bo zapytanie dotyczyło dwóch lat ( tabel) bazy. Utworzyłem kwerendę a na jej podstawie raport w base i wszystko pięknie działa. Przetestowałem raport bezpośrednio na serwerze głównym bazy i dane zapytania prawidłowo się generowały. ( Błędów logicznych w uzyskanym wyniku zapytania też nie znaleziono)
Niestety okazało się, że jak zapytanie kierowane jest przez użytkowników do bazy nie z serwera głównego a z innego terminala to MySQL pokazuje błąd i nie generuje raportu Informując komunikatem, że nie może załadować danych.
Oto treść komunikatu:

Kod: Zaznacz cały

 
[MySQL][]ODBC 3.51 Driver][mysqld-5.1.42-community] Illegal mix of collations for operation 'UNION'
Serwer z bazą jest postawiony na Windowsie XP, MySQL wersja 5.1.42, do połączenia z bazą openoffice używa konektora ODBC wersja 3.51.

Podaje zapytanie wywołujące ten błąd :

Kod: Zaznacz cały

SELECT 
`2009`.`wolne_1` AS `L.p.`,
`2009`.`RSD`,
`2009`.`rok`,
`2009`.`prowadzacy` AS `prowadzący`,
`2009`.`kwalifikacja`,
`2009`.`forma_postepowania` AS `forma`,
`2009`.`data_zdarzenia` AS `data zdarzenia`,
`2009`.`data_wszczecie` AS `data wszczęcia`,
`2009`.`data_przedluzenia` AS `data przedłużenia`,
`2009`.`uwagi` AS `data i  obieg`,
`2009`.`wolne_1` AS `uwagi bieżące`

FROM 
`2009` AS `2009`

WHERE 
((`data_wszczecie` < curdate()-interval 2 month) 
AND ( `data_przedluzenia`is null OR `data_przedluzenia` < curdate()) 
AND `forma_postepowania` ='zwykłe' 
AND `2009`.`koniec` = 0)
	OR
((`data_wszczecie` < curdate()-interval 3 month) 
AND ( `data_przedluzenia`is null OR `data_przedluzenia` < curdate()) 
AND `forma_postepowania` ='pilne' 
AND `2009`.`koniec` = 0)


	UNION ALL


SELECT 
`2010`.`wolne_1` AS `L.p.`,
`2010`.`RSD`,
`2010`.`rok`,
`2010`.`prowadzacy` AS `prowadzący`,
`2010`.`kwalifikacja`,
`2010`.`forma_postepowania` AS `forma`,
`2010`.`data_zdarzenia` AS `data zdarzenia`,
`2010`.`data_wszczecie` AS `data wszczęcia`,
`2010`.`data_przedluzenia` AS `data przedłużenia`,

GROUP_CONCAT(CONCAT_WS('  ', CONVERT(`2010_obieg`.`data`, CHAR(10)),`2010_obieg`.`obieg`) SEPARATOR '\n') AS `data i obieg`,

`2010`.`wolne_1` AS `uwagi bieżące`

FROM 
{ OJ `rsd`.`2010` AS `2010` LEFT OUTER JOIN `rsd`.`2010_obieg` AS `2010_obieg` ON `2010`.`RSD` = `2010_obieg`.`id_rsd` }

WHERE 
((`data_wszczecie` < curdate()-interval 2 month) 
AND ( `data_przedluzenia`is null OR `data_przedluzenia` < curdate()) 
AND `forma_postepowania` ='zwykłe' 
AND `2010`.`koniec` = 0)
	OR
((`data_wszczecie` < curdate()-interval 3 month) 
AND ( `data_przedluzenia`is null OR `data_przedluzenia` < curdate()) 
AND `forma_postepowania` ='pilne' 
AND `2010`.`koniec` = 0)

GROUP BY `RSD`

ORDER BY `rok`,`rsd`;
Nie wiem co w tym połączeniu UNION MySQL widzi nienormalnego i dlaczego akurat tylko w przypadku logowania się do bazy z sieci, a przy logowaniu na serwerze błędu nie ma. Ufff - to musi być jakaś błahostka - jakieś pomysły?.
Windows 7 i openoffice 3.2
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Operator UNION - konkatenacja i złączenie lewostronne

Post autor: Jan_J »

W MySQL prawa użytkowników tworzy się i przechowuje dla par user@host. By może nie wszystkie tabele dostępne dla danego użytkownika ze zdalnego połączenia.
Sprawdź SHOW GRANTS FOR 'user@host'
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Re: Operator UNION - konkatenacja i złączenie lewostronne

Post autor: czp »

Do zarządzania użytkownikami używam MySQL Administratora.

Za chwile posprawdzam te uprawnienia, ale globalnie wszyscy użytkownicy mają nadane uprawnienie "select" więc tabele bazy widzą, jedynie uprawnienia do wpisywania i modyfikacji mają różnie w zależności od ich potrzeb.

Hmmm - ze względów bezpieczeństwa mam postawioną też replikację bazy MySQL na innym komputerze w sieci, ale to raczej nie może mieć związku z tym błędem.
Windows 7 i openoffice 3.2
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Re: Operator UNION - konkatenacja i złączenie lewostronne

Post autor: czp »

Podaję jeszcze moją konfigurację serwera bazy MySQL - może tu tkwi jakiś błąd.

Kod: Zaznacz cały

#  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  * * * *
#  * Konfiguracja servera głównego bazy RSD `mastera` -   MySQL 5.1.4.2       *
#  *                                                                          *
#  *                                                                          *
#  *------------------------------------------------------------------------  *
#  *                                                                 czp      *
#  *                                                                          *
#  * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * *


[client]

port=3306


[mysql]

default-character-set=utf8


[mysqld]

port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="D:/baza/MySQL/MySQL Server 5.1/data/"

language=C:/Program Files/MySQL/MySQL Server 5.1/share/polish
character_sets-dir="C:/Program Files/MySQL/MySQL Server 5.1/share/charsets"
init-connect='SET NAMES utf8'
character-set-server=utf8
default-character-set=utf8
default-collation=utf8_polish_ci


# kod poniżej - wymuszone pomijanie żądań klienta ODBC o kodowanie 
skip-character-set-client-handshake


# *****************************************************************************
# zmiany replikacji na serwerze głównym

server-id=1
log-bin=D:/baza/dzienniki/log-bin/bin.log
binlog-do-db=rsd
slave_net_timeout=360
master-connect-retry=60

# koniec zmian do replikacji
# *****************************************************************************


default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=0
table_cache=256
tmp_table_size=5M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=8M
key_buffer_size=8M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=212K

innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=10M
innodb_thread_concurrency=8

# dwa podstawowe logi 
log=D:/baza/dzienniki/query.txt
log-slow-queries=D:/baza/dzienniki/queries.txt

# koniec konfiguracji na serverze master 




Windows 7 i openoffice 3.2
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Re: Operator UNION - konkatenacja i złączenie lewostronne

Post autor: czp »

Problemu nie rozwiązałem ale go obszedłem i nie ma to związku z logowaniem się w sieci.

Otóż najzwyklejszy użytkownik bazy MySQL ma przyznane do tej bazy jedynie globalne uprawnienie "SELECT" i to mu wystarczało do tej pory do korzystania z danych bazy i generowania różnych raportów i zapytań w tym z operatorami UNION i złączenia lewo i prawostronnego i wielu innych.

Problem powstał dopiero przy opisanym w tym temacie zapytaniu w którym jednocześnie występuje zapytanie z podwójną konkatenacją, grupowaniem, złączeniem lewostronnym i złączeniu tych zapytań przy pomocy operatora UNION. Tak zagnieżdżone zapytanie powoduje błąd ( ale nie wiem zupełnie dlaczego):

Kod: Zaznacz cały

[MySQL][]ODBC 3.51 Driver][mysqld-5.1.42-community] Illegal mix of collations for operation 'UNION'
Jeżeli zapytanie to kieruje do bazy administrator root - to MySQL nie wykazuje błędu i generuje poprawne wyniki tego zapytania. Wszyscy inni użytkownicy niezależnie od posiadanych uprawnień otrzymują powyższy komunikat o błędzie.

Jeżeli zwykłemu użytkownikowi który posiada uprawnienia "SELECT" dodam uprawnienie "SUPER" a więc uprawnienie z zakresu administracji serwerem to błąd w bazie przy korzystaniu z omówionego zapytania nie występuje.

Pozostało pytanie dlaczego tak się dzieje ????? a poza tym zwykły użytkownik nie powinien mieć żadnych innych uprawnień niż tylko "SELECT".
Windows 7 i openoffice 3.2
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Operator UNION - konkatenacja i złączenie lewostronne

Post autor: Jan_J »

JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ