Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Probleme mit Stored Procedures

2 views
Skip to first unread message

Matthias Braun

unread,
Jan 3, 2010, 8:09:07 AM1/3/10
to
Help!

Ich habe eine simple Tabelle "Topic" mit einer Spalte TopicId
(autoincrement PK) und TopicName vom Typ varchar(255). Dazu eine simple
Stored Procedure (SP), um den TopicNamen neu anzulegen bzw. umzubenennen:

CREATE PROCEDURE SP_UpdateTopic(IN TopicId INT, IN TopicName CHAR(255))
BEGIN
DECLARE CheckTopicId INT DEFAULT 0;
select t.TopicId from topic t where t.TopicName like TopicName into
CheckTopicId;
(...)
DELIMITER ;

Soweit, so gut. Wenn ich jetzt die SP aufrufe, bekomme ich eine
Fehlermeldung:

call SP_UpdateTopic(0,'MyTopic');

Error Code : 1267
Illegal mix of collations (latin1_german1_ci,IMPLICIT) and
(latin1_swedish_ci,IMPLICIT) for operation 'like'

Ich habe schon alles versucht, z.B. an die Tabellendefinition
"CHARSET=latin1 COLLATE=latin1_german1_ci" angeh�ngt. Problem ist, dass
irgendeine Default-Einstellung bei mir "Schwedisch" ist, aber in der
my.cnf steht kein entsprechender Eintrag. Auch irgendwelche Befehle wie

set collation_connection = 'latin1_german1_ci';

schlagen fehl. Was ist zu tun?

Danke,

Matthias

Axel Schwenke

unread,
Jan 3, 2010, 8:58:01 AM1/3/10
to
Matthias Braun <mat_...@web.de> wrote:
>
> Ich habe eine simple Tabelle "Topic" mit einer Spalte TopicId
> (autoincrement PK) und TopicName vom Typ varchar(255).

Und welches Encoding (CHARSET) bzw. welche Collation hat die Spalte?
SHOW FULL FIELDS ... hilft

> Dazu eine simple
> Stored Procedure (SP), um den TopicNamen neu anzulegen bzw. umzubenennen:
>
> CREATE PROCEDURE SP_UpdateTopic(IN TopicId INT, IN TopicName CHAR(255))
> BEGIN
> DECLARE CheckTopicId INT DEFAULT 0;
> select t.TopicId from topic t where t.TopicName like TopicName into
> CheckTopicId;
> (...)
>

> Soweit, so gut. Wenn ich jetzt die SP aufrufe, bekomme ich eine
> Fehlermeldung:
>
> call SP_UpdateTopic(0,'MyTopic');
>
> Error Code : 1267
> Illegal mix of collations (latin1_german1_ci,IMPLICIT) and
> (latin1_swedish_ci,IMPLICIT) for operation 'like'

Links und recht vom 'like' stehen Strings mit gleichem CHARSET, aber
unterschiedlicher COLLATION. Der Parameter TopicName (�brigens eine
selten d�mliche Idee, den Parameter genauso zu nennen wie die Spalte
der Tabelle) bekommt seine Collation von collation_connection, f�r
die Spalte ist die Tabellendefinition relevant.

siehe: http://dev.mysql.com/doc/refman/5.1/en/charset-literal.html
bzw: http://dev.mysql.com/doc/refman/5.1/en/charset-column.html

dein Problem ist, da� links und rechts von 'like' Strings mit der
gleichen coercibility stehen:

http://dev.mysql.com/doc/refman/5.1/en/charset-collate-tricky.html

> Ich habe schon alles versucht, z.B. an die Tabellendefinition
> "CHARSET=latin1 COLLATE=latin1_german1_ci" angeh�ngt. Problem ist, dass
> irgendeine Default-Einstellung bei mir "Schwedisch" ist, aber in der
> my.cnf steht kein entsprechender Eintrag. Auch irgendwelche Befehle wie
>
> set collation_connection = 'latin1_german1_ci';
>
> schlagen fehl. Was ist zu tun?

Um zielgerichtet vorgehen zu k�nnen, w�rde es sich anbieten, das
Manual zu lesen </Zaunpfahl>

Im genannten Fall w�re es vermutlich am besten, eine explizite
COLLATE ... Klausel in das SELECT zu schreiben (mit der Collation
der Tabellen-Spalte). Auch dazu noch ein Link auf das Handbuch:

http://dev.mysql.com/doc/refman/5.1/en/charset-collate.html

Warum du allerdings LIKE verwendest statt '=', erschlie�t sich mir
nicht so recht. Insbesondere im Kontext "um den TopicNamen neu
anzulegen bzw. umzubenennen" w�rde ich nicht erwarten, da�
TopicName irgendwelche Wildcards enth�lt.


XL

0 new messages