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