Order/Collation bei mit CONCAT zusammengebauten Feld aus Varcharund Int

Order/Collation bei mit CONCAT zusammengebauten Feld aus Varcharund Int

am 13.10.2006 19:43:57 von Guido Schmidt

CREATE TABLE w_produzenten (
id int(4) NOT NULL auto_increment,
name varchar(100) collate latin1_german2_ci NOT NULL,
PRIMARY KEY (id)
) ENGINE=3DInnoDB DEFAULT CHARSET=3Dlatin1 COLLATE=3Dlatin1_german2_ci;

SELECT CONCAT(name, ' [', id, ']' ) AS value
FROM w_produzenten
ORDER BY value

liefert:
Andreas [5]
Theodor [1]
anton [3]

Ich möchte aber die Reihenfolge

Andreas [5]
anton [3]
Theodor [1]

SELECT CONCAT(name, ' [', id, ']' ) COLLATE latin1_german2_ci AS value
FROM w_produzenten
ORDER BY value
=3D> COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET 'binary=
'

SELECT CONCAT(name, ' [', id, ']' ) AS value
FROM w_produzenten
ORDER BY value COLLATE latin1_german2_ci
=3D> Unknown column 'value' in 'order clause'

Gibt es eine Möglichkeit bei einer Sortierung nach value die gewünsch=
te=20
Reihenfolge zu erhalten? Eine Sortierung nach name ist für das=20
vereinfachte Beispiel die naheliegendste Lösung, aber nicht für das=20
eigentliches Problem.

Guido Haeger

Re: Order/Collation bei mit CONCAT zusammengebauten Feld aus Varchar und Int

am 14.10.2006 12:14:29 von Claus Reibenstein

Guido Schmidt schrieb:

> SELECT CONCAT(name, ' [', id, ']' ) AS value
> FROM w_produzenten
> ORDER BY value
>
> liefert:
> Andreas [5]
> Theodor [1]
> anton [3]

Ja, und zwar genau deshalb:

> => COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET 'binary'

Sprich: value hat keinen CHARACTER SET, sondern wird als binary
betrachtet. Entsprechend sieht auch die Sortierung aus. Wie man das
beeinflusst, kann ich Dir allerdings nicht sagen. Dazu reichen meine
MySQL-Kenntnisse (noch) nicht aus.

> SELECT CONCAT(name, ' [', id, ']' ) AS value
> FROM w_produzenten
> ORDER BY value COLLATE latin1_german2_ci
> => Unknown column 'value' in 'order clause'

Das allerdings wundert mich. Vielleicht ein MySQL-Bug?

> Gibt es eine Möglichkeit bei einer Sortierung nach value die gewünschte
> Reihenfolge zu erhalten? Eine Sortierung nach name ist für das
> vereinfachte Beispiel die naheliegendste Lösung, aber nicht für das
> eigentliches Problem.

Was spricht gegen ORDER BY name, id? Oder passt das auch nicht zum
eigentlichen Problem?

Gruß. Claus

Re: Order/Collation bei mit CONCAT zusammengebauten Feld aus Varchar und Int

am 14.10.2006 12:25:19 von Kai Ruhnau

Guido Schmidt wrote:
> CREATE TABLE w_produzenten (
> id int(4) NOT NULL auto_increment,
> name varchar(100) collate latin1_german2_ci NOT NULL,
> PRIMARY KEY (id)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
>
> SELECT CONCAT(name, ' [', id, ']' ) AS value
> FROM w_produzenten
> ORDER BY value
>
> liefert:
> Andreas [5]
> Theodor [1]
> anton [3]
>
> Ich möchte aber die Reihenfolge
>
> Andreas [5]
> anton [3]
> Theodor [1]
>
> SELECT CONCAT(name, ' [', id, ']' ) COLLATE latin1_german2_ci AS value
> FROM w_produzenten
> ORDER BY value
> => COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET 'binary'
>
> SELECT CONCAT(name, ' [', id, ']' ) AS value
> FROM w_produzenten
> ORDER BY value COLLATE latin1_german2_ci
> => Unknown column 'value' in 'order clause'
>
> Gibt es eine Möglichkeit bei einer Sortierung nach value die gewünschte
> Reihenfolge zu erhalten? Eine Sortierung nach name ist für das
> vereinfachte Beispiel die naheliegendste Lösung, aber nicht für das
> eigentliches Problem.

http://bugs.mysql.com/bug.php?id=18302

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Order/Collation bei mit CONCAT zusammengebauten Feld aus Varchar und Int

am 14.10.2006 12:43:31 von Guido Schmidt

Kai Ruhnau schrieb:

> http://bugs.mysql.com/bug.php?id=18302

Besten Dank!

Guido

Re: Order/Collation bei mit CONCAT zusammengebauten Feld aus Varchar und Int

am 14.10.2006 14:58:57 von Guido Schmidt

Claus Reibenstein schrieb:

> Sprich: value hat keinen CHARACTER SET, sondern wird als binary
> betrachtet. Entsprechend sieht auch die Sortierung aus. Wie man das
> beeinflusst, kann ich Dir allerdings nicht sagen. Dazu reichen meine
> MySQL-Kenntnisse (noch) nicht aus.

Das folgende funktioniert:

SELECT CONCAT(name, ' [', CONVERT(id, CHAR(5)), ']' ) COLLATE
'latin1_german2_ci' AS value
FROM w_produzenten
ORDER BY value

> Was spricht gegen ORDER BY name, id? Oder passt das auch nicht zum
> eigentlichen Problem?

Das Problem ist, dass ich kein beliebiges SQL-Statement verwenden kann.
Das SQL-Statement wird von einer Anwendung aus ein paar Attributen in
einer XML-Datei dynamisch zusammengebaut.

Guido

Re: Order/Collation bei mit CONCAT zusammengebauten Feld aus Varchar und Int

am 14.10.2006 21:15:36 von Hertha Steck

Am Sat, 14 Oct 2006 12:14:29 +0200 schrieb Claus Reibenstein:

> Guido Schmidt schrieb:
>
>> SELECT CONCAT(name, ' [', id, ']' ) AS value FROM w_produzenten
>> ORDER BY value
>>
>> liefert:
>> Andreas [5]
>> Theodor [1]
>> anton [3]
>
> Ja, und zwar genau deshalb:
>
>> => COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET
>> 'binary'
>
> Sprich: value hat keinen CHARACTER SET, sondern wird als binary
> betrachtet. Entsprechend sieht auch die Sortierung aus. Wie man das
> beeinflusst, kann ich Dir allerdings nicht sagen. Dazu reichen meine
> MySQL-Kenntnisse (noch) nicht aus.
>
>
Hier dürfte der Abschnitt zu "CONCAT" (12.3, String Functions) aus dem
Handbuch einschlägig sein:

"CONCAT(str1,str2,...)

Returns the string that results from concatenating the arguments. May have
one or more arguments. If all arguments are non-binary strings, the result
is a non-binary string. If the arguments include any binary strings, the
result is a binary string. A numeric argument is converted to its
equivalent binary string form; if you want to avoid that, you can use an
explicit type cast, as in this example:

SELECT CONCAT(CAST(int_col AS CHAR), char_col);"

Ich vermute jedenfalls mal, dass das Feld "id" von einem numerischen Typ
ist.

Grüße,
Hertha

Re: Order/Collation bei mit CONCAT zusammengebauten Feld aus Varchar und Int

am 15.10.2006 00:00:28 von Claus Reibenstein

Hertha Steck schrieb:

> Hier dürfte der Abschnitt zu "CONCAT" (12.3, String Functions) aus dem
> Handbuch einschlägig sein:

Habe ich inzwischen auch gefunden. Danke.

> Ich vermute jedenfalls mal, dass das Feld "id" von einem numerischen Typ
> ist.

Das brauchst Du nicht zu vermuten. Das kannst Du im Ursprungsposting
nachlesen ;-)

Gruß. Claus