Avatar billede preben.m Nybegynder
29. juli 2006 - 01:25 Der er 13 kommentarer og
1 løsning

Union af to select sætninger

Jeg for følgende fejl når jeg prøver at benytte union

Illegal mix of collations  for operation 'UNION' Error 1271

min forspørgelse:
select 'out',CONCAT('0',q.prefix), qt.name AS prefix
from qos_digit_list q, qos_digit_provider qp, qos_digit_type qt
    where q.type = qt.id
    and q.provider = qp.id
union
select 'in' as one ,u.extn as two, u.login as three from qos_users u;

Hvad kan være galt det virker når jeg kun henter fra den ene tabel (qos_digit_list), men det lader ikke til at mine joins virker sammen med union, jeg har prøvet at oprette et view for at se hvad der sker men samme fejl opstår... !!!

tabeller
------------------------------------------------
CREATE TABLE `qos_digit_list` (
  `prefix` varchar(32) collate latin1_danish_ci NOT NULL default '0',
  `type` int(10) unsigned NOT NULL default '0',
  `provider` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`prefix`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci;

CREATE TABLE `qos_digit_provider` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `Name` varchar(45) collate latin1_danish_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci;

CREATE TABLE `qos_digit_type` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `Name` varchar(80) collate latin1_danish_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci;

CREATE TABLE `qos_users` (
  `extn` int(10) unsigned NOT NULL default '0',
  `login` varchar(45) character set latin1 NOT NULL default '',
  `password` varchar(12) character set latin1 NOT NULL default '',
  `phonetype` int(10) unsigned NOT NULL default '0',
  `fullname` varchar(45) character set latin1 NOT NULL default '',
  `email` varchar(45) character set latin1 NOT NULL default '',
  `headset` tinyint(1) default NULL,
  `IP` varchar(45) character set latin1 default NULL,
  `location` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`extn`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci;
Avatar billede Slettet bruger
29. juli 2006 - 02:33 #1
I den første er parameter nummer 2 en streng. I den anden er parameter nummer 2 en int. Den går ikke. Returparametrene skal være samme typer i de to queries.

Du skal også være opmærksom på længderne af parametrene, da maxlængden på en varchar i den første kan bestemme, hvor meget af strengene den tager med fra den anden query - men i dette tilfælde burde det ikke gøre noget, da du har 80 i den første og 45 i den anden.
Avatar billede preben.m Nybegynder
29. juli 2006 - 02:42 #2
Ja det ville jeg også tro men det er faktisk parameter 3 der laver fejlen, for denne virker:

select 'out',CONCAT('0',q.prefix), qt.name AS prefix
from qos_digit_list q, qos_digit_provider qp, qos_digit_type qt
    where q.type = qt.id
    and q.provider = qp.id
union
select 'in' as one ,u.extn as two, u.login as three from qos_users u;
Avatar billede arne_v Ekspert
29. juli 2006 - 02:48 #3
prøv:

select 'out',CONCAT('0',q.prefix), qt.name AS prefix
from qos_digit_list q, qos_digit_provider qp, qos_digit_type qt
    where q.type = qt.id
    and q.provider = qp.id
union
select 'in' as one ,u.extn as two, u.login ollate latin1_danish_ci as three from qos_users u;
Avatar billede arne_v Ekspert
29. juli 2006 - 02:48 #4
om igen:

select 'out',CONCAT('0',q.prefix), qt.name AS prefix
from qos_digit_list q, qos_digit_provider qp, qos_digit_type qt
    where q.type = qt.id
    and q.provider = qp.id
union
select 'in' as one ,u.extn as two, u.login collate latin1_danish_ci as three from qos_users u;
Avatar billede preben.m Nybegynder
29. juli 2006 - 15:13 #5
Hej Arne det ser ud til at virke, kan du fortælle hvorfor det går galt, når jeg ikke bruger collate latin1_danish_ci ?. Jeg var selv i samme retning i forhold til tegnsættet men, jeg prøvet at ændre de bagvedlægende tabeller til alle mulige forskellige encodings, men intet hjalp. Men det gjorde det lille trick, kan du ikke fortælle hvorfor (hvis du ved det) i et svar, du har igen fortjent points ;-) Din MySQL haj
Avatar billede arne_v Ekspert
29. juli 2006 - 15:56 #6
jeg har set problemet før

problemet er at den tredie kolonne har en collation i den øverste del af union
og en anden collation i den nederste del af union

og selvom det kan synes at være en lille detalje, så vil ikke MySQL acceptere det

hvis nu du vil have sorteret query output efter den kolonne
Avatar billede arne_v Ekspert
29. juli 2006 - 15:56 #7
og et svar
Avatar billede Slettet bruger
29. juli 2006 - 17:10 #8
Ok, så den vil godt acceptere en int, hvor der burde have været en streng, for den kan den godt konvertere uden ydeligere oplysninger.
Avatar billede arne_v Ekspert
29. juli 2006 - 17:12 #9
type sikkerheden i MySQL er ikke specielt stor
Avatar billede preben.m Nybegynder
29. juli 2006 - 23:08 #10
Jeg kan nu ikke forstå at man skal bruge collation. Er det et meget specielt tilfælde ??
Avatar billede arne_v Ekspert
29. juli 2006 - 23:23 #11
sådan er det

mysql> select 123 union select 'abc';
+-----+
| 123 |
+-----+
| 123 |
| abc |
+-----+
2 rows in set (0.00 sec)

type mix => no problem

mysql> select 'abc' collate latin1_danish_ci as s union select 'def' collate latin1_swedish_ci as s;
ERROR 1267 (HY000): Illegal mix of collations (latin1_danish_ci,EXPLICIT) and (l
atin1_swedish_ci,EXPLICIT) for operation 'UNION'

blande dansk og svensk => big problem

mysql> select 'abc' collate latin1_danish_ci as s union select 'def' collate latin1_danish_ci as s;
+-----+
| s  |
+-----+
| abc |
| def |
+-----+
2 rows in set (0.00 sec)
Avatar billede preben.m Nybegynder
30. juli 2006 - 00:07 #12
Uhmm, ja det er en meget fin fejlbeskrivelse du får tilbage, jeg får

COLLATION 'latin1_danish_ci' is not valid for CHARACTER SET 'utf8'

hvor du får
ERROR 1267 (HY000): Illegal mix of collations (latin1_danish_ci,EXPLICIT) and (l
atin1_swedish_ci,EXPLICIT) for operation 'UNION'

Kan jeg gøre noget for at få lidt bedre fejlbeskivelser jeg bruger
SELECT VERSION(); 5.0.22-community-nt
Avatar billede arne_v Ekspert
30. juli 2006 - 01:33 #13
min fejl

mit eksempel matchede vist ikke helt problem stillingen

jeg kan godt få din fejl tekst også

mysql> SELECT CAST('abc' AS CHAR CHARACTER SET utf8);
+----------------------------------------+
| CAST('abc' AS CHAR CHARACTER SET utf8) |
+----------------------------------------+
| abc                                    |
+----------------------------------------+
1 row in set (0.01 sec)

mysql> SELECT CAST('abc' AS CHAR CHARACTER SET utf8) COLLATE latin1_danish_ci AS s;
ERROR 1253 (42000): COLLATION 'latin1_danish_ci' is not valid for CHARACTER SET
'utf8'
Avatar billede preben.m Nybegynder
30. juli 2006 - 02:14 #14
Tak skal du have Arne, jeg har ikke flere spørgsmål, jeg tror ander der ramme dette spørgsmål vil få meget ud af det du har bidraget med, jeg takker mange gange.

P.S. Glæder mig allerede til at give dig points næste gang ;-)

også tak til dig sandbox !!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester