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
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