Toon posts:

[MYSQL] group_concat onvolledig resultaat bij multibyte txt

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik een group_concat om een aantal velden samen te voegen in een ander veld. Dit werkt prima zolang er geen speciale tekens in de teksten staan, anders wordt vanaf de posititie van het speciale teken de tekst afgebroken.
Ik heb op het myql forum gezien dat dit een bug zou zijn, maar gezien het moment van posten kan ik me niet voorstellen dat deze bug nog steeds zou bestaan, zie http://lists.mysql.com/commits/14930
Ik werk zelf met mysql 5.0.51a3 op ubuntu 8.0.4.3
De database, tabellen en velden zijn allemaal utf8 en collatie utf8_general_ci

Om een voorbeeld te geven

a=blaat
b=blät
c=foo

insert into table2 select group_concat(a,b,c) as d from table

inhoud tabl2 na deze query is

d=blaatbl

Iemand een idee hoe dit te fixen is.

De werkelijke query is een stuk uitgebreider, maar dit illustreert het probleem in ieder geval

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik ben eerder eigenlijk benieuwd naar waarom je group_concat gebruikt; een functie die, wat mij betreft, het daglicht nooit had mogen zien en het duidt er waarschijnlijk op dat je database ontwerp niet helemaal optimaal is danwel dat de code welke de gegevens benodigt van de betreffende query slimmer/beter kan.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Komen de charsets wel overeen?

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op donderdag 23 juli 2009 @ 13:29:
Ik ben eerder eigenlijk benieuwd naar waarom je group_concat gebruikt; een functie die, wat mij betreft, het daglicht nooit had mogen zien en het duidt er waarschijnlijk op dat je database ontwerp niet helemaal optimaal is danwel dat de code welke de gegevens benodigt van de betreffende query slimmer/beter kan.
Vanuit normalisatieoogpunt heb je absoluut gelijk, echter vanuit performance oogpunt zeker niet, de samengevoegde string wordt gebruikt om te zoeken in een productdatabase van ca. 130.000 artikelen. t.o.v. een juist genormaliseerde db wordt nu een inmense performanceverbetering bereikt, zeker wanneer er meerdere zoekopdrachten gelijktijdig worden gedaan.
Ik heb trouwens inmiddels een workaround kunnen creeeren, door de select en insert niet in 1 query door te voeren, maar door te inserten binnen een lus. Qua performance stukken slechter, maar nu komen de strings wel goed in de db. ( 8 seconden t.o.v. 2 minuten)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Yep, alles is utf8. Het resultaat van de select is trouwens goed, het gaat pas mis bij de insert.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op donderdag 23 juli 2009 @ 13:59:
echter vanuit performance oogpunt zeker niet, de samengevoegde string wordt gebruikt om te zoeken in een productdatabase van ca. 130.000 artikelen.
offtopic:
Dan zit je overigens wel in de buurt van de magische 'je gaat balen van fulltext en no way dat je het snel krijgt'-drempel. :p Lucene/sphinx/xapian ftw.

{signature}


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op donderdag 23 juli 2009 @ 13:21:
a=blaat
b=blät
c=foo

insert into table2 select group_concat(a,b,c) as d from table

inhoud tabl2 na deze query is

d=blaatbl
Dat is dan gek, want bij mij gebeurd dit niet als ik het even check met een net iets oudere MySQL-versie...
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
drop table if exists t1,t2;
set names utf8;
create table t1
(
  a text character set utf8 not null,
  b text character set utf8 not null,
  c text character set utf8 not null
);
insert into t1 values ('test','aap', 'mies'), 
    ('test',concat('a',repeat(_utf8 0xc3b7, 4),'a'), 'ds');
create table t2(a text character set utf8 not null);
insert into t2 select group_concat(a,b,c) from t1;
select group_concat(a,b,c) from t1;
select * from t2;

Zie geen verschil. Werkt gewoon concat wel? Werkt het als je er "select * from (select ...)" van maakt?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat laatste was het!

Deze query werkt niet (althans wat betreft de group_concat, rest wordt wel correct gevuld, zonder foutmelding)
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
insert into test 
SELECT
        u.unspsc,
        m.omschrijving as merk,
        p.artikel,
        p.oem,
        u.unspsc_omschrijving_nl AS cat_nl,
        u.unspsc_omschrijving_en AS cat_en,
        u.unspsc_omschrijving_fr AS cat_fr,
        u.unspsc_omschrijving_de AS cat_de,
        p.omschrijving_nl,
        p.omschrijving_en,
        p.omschrijving_fr,
        p.omschrijving_de,
        concat(m.omschrijving,
replace(replace(p.artikel,'-',''),' ',''),
p.oem,
replace(replace(replace(p.omschrijving_nl,'-',''),'+',''),' ',''),
replace(replace(replace(p.omschrijving_en,'-',''),'+',''),' ',''),
replace(replace(replace(p.omschrijving_fr,'-',''),'+',''),' ',''),
replace(replace(replace(p.omschrijving_de,'-',''),'+',''),' ',''),
p.artikelsoort,p.ean,
u.unspsc_omschrijving_nl,
u.unspsc_omschrijving_de,
u.unspsc_omschrijving_en,
u.unspsc_omschrijving_fr) AS 
omschrijving_extra,
p.artikelsoort,
        p.id,
        m.image as img,
    null as ean,
        (SELECT group_concat(debiteur,':',debiteurartikelnummer) FROM debiteur_artikelen da WHERE da.artikelnummer=p.artikel) AS debiteurartikelen
        FROM
        products p
        INNER JOIN merken m
        ON m.merk = p.merk
        INNER JOIN unspsc u
        ON p.unspsc = u.unspsc ORDER BY artikel

maar deze wel :)
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
insert into test (
SELECT
        u.unspsc,
        m.omschrijving as merk,
        p.artikel,
        p.oem,
        u.unspsc_omschrijving_nl AS cat_nl,
        u.unspsc_omschrijving_en AS cat_en,
        u.unspsc_omschrijving_fr AS cat_fr,
        u.unspsc_omschrijving_de AS cat_de,
        p.omschrijving_nl,
        p.omschrijving_en,
        p.omschrijving_fr,
        p.omschrijving_de,
        concat(m.omschrijving,
replace(replace(p.artikel,'-',''),' ',''),
p.oem,
replace(replace(replace(p.omschrijving_nl,'-',''),'+',''),' ',''),
replace(replace(replace(p.omschrijving_en,'-',''),'+',''),' ',''),
replace(replace(replace(p.omschrijving_fr,'-',''),'+',''),' ',''),
replace(replace(replace(p.omschrijving_de,'-',''),'+',''),' ',''),
p.artikelsoort,p.ean,
u.unspsc_omschrijving_nl,
u.unspsc_omschrijving_de,
u.unspsc_omschrijving_en,
u.unspsc_omschrijving_fr) AS 
omschrijving_extra,
p.artikelsoort,
        p.id,
        m.image as img,
    null as ean,
        (SELECT group_concat(debiteur,':',debiteurartikelnummer) FROM debiteur_artikelen da WHERE da.artikelnummer=p.artikel) AS debiteurartikelen
        FROM
        products p
        INNER JOIN merken m
        ON m.merk = p.merk
        INNER JOIN unspsc u
        ON p.unspsc = u.unspsc ORDER BY artikel)


Thanks! :*)
Pagina: 1