Pourquoi suis-je en voyant “CLASSEMENT 'xxx' est pas valide pour le JEU de CARACTÈRES 'yyy'”
Je suis sur MySQL 5.6.22 (InnoDB) sur Amazon RDS. J'ai essayé de mettre toutes mes tables, des colonnes, de la connexion et de la base de données de jeu de caractères et les paramètres de classement de utf8mb4 /utf8mb4_unicode_ci. Je peux trouver aucune preuve de l'existence que tout ce qui a charset latin1
, mais quand j'exécute le code suivant (par nœud-mysql, ou directement dans "Sequel Pro" de l'application sur mon Mac):
update MyTable m
set m.Column8 = 1
where m.Column3 = 26 and m.Column4 = 76
collate utf8mb4_unicode_ci
J'obtiens ce message d'erreur:
COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'latin1'
Je ne trouve pas rien ensemble de latin1
dans ma configuration.
Sortie de show variables like "char%"
:
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem utf8mb4
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir /rdsdbbin/mysql-5.6.22.R1/share/charsets/
Sortie de show variables like "collation%"
:
collation_connection utf8mb4_unicode_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_unicode_ci
MyTable CRÉER une TABLE info:
CREATE TABLE `MyTable` (
`Column1` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`Column2` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`Column3` bigint(20) unsigned NOT NULL,
`Column4` bigint(20) unsigned NOT NULL,
`Column5` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`Column6` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`Column7` varchar(112) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`Column8` tinyint(1) unsigned NOT NULL,
`Column9` decimal(16,14) DEFAULT NULL,
`Column10` decimal(17,14) DEFAULT NULL,
`Column11` bigint(20) unsigned DEFAULT NULL,
`Column12` bigint(20) unsigned DEFAULT NULL,
`Column13` timestamp(6) NULL DEFAULT NULL,
`Column14` timestamp(6) NULL DEFAULT NULL,
`Column15` tinyint(4) NOT NULL DEFAULT '1',
`Column16` tinyint(4) NOT NULL DEFAULT '1',
`Column17` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`Column18` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`Column19` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`Column1`),
KEY `IX_Reevues_Column3` (`Column3`),
KEY `IX_Reevues_Column4` (`Column4`),
KEY `IX_Reevues_Column6` (`Column6`),
KEY `IX_Reevues_Column8` (`Column8`),
KEY `IX_Reevues_Column2` (`Column2`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Peut être de l'aide.
Vous utilisez des champs de caractère dans la clause where. Quel est le but de " rassembler , à la sortie de la curiosité?
Cette instruction SQL est la version la plus simple de mon véritable déclaration que j'ai pu montrer que encore déclenché l'erreur. Le véritable déclaration n'a normalement contenir une comparaison de deux valeurs de chaîne, c'est pourquoi le COLLATE déclaration a été ajoutée. Suggérez-vous que si aucune chaîne de valeurs sont comparées, les ASSEMBLER déclaration doit être enlevé, ou il va générer ce type d'erreur?
Vous utilisez des champs de caractère dans la clause where. Quel est le but de " rassembler , à la sortie de la curiosité?
Cette instruction SQL est la version la plus simple de mon véritable déclaration que j'ai pu montrer que encore déclenché l'erreur. Le véritable déclaration n'a normalement contenir une comparaison de deux valeurs de chaîne, c'est pourquoi le COLLATE déclaration a été ajoutée. Suggérez-vous que si aucune chaîne de valeurs sont comparées, les ASSEMBLER déclaration doit être enlevé, ou il va générer ce type d'erreur?
OriginalL'auteur Mason G. Zhwiti | 2015-02-23
Vous devez vous connecter pour publier un commentaire.
Pourquoi une clause COLLATE lorsque l'on compare un BIGINTs par rapport à littérale des nombres? Supprimer la clause COLLATE dans l'instruction de mise à JOUR. -- C'est la principale solution, comme par OP commentaires.
Est le code à l'intérieur d'un Stockées Routine qui était construction avec latin1? MONTREZ-création d'une PROCÉDURE (ou FONCTION) pour voir si c'était le cas. Si oui, puis le supprimer et de le recréer avec utf8mb4 en vigueur.
Il est risqué de changer character_set_filesystem et character_set_server. Les modifier.
Simplifiée, vous avez trop. Les chiffres n'ont pas besoin de classement. Ont été de la chaîne de valeurs dans des colonnes ou des littéraux?
#3-je ne sais pas l'impact. J'ai essentiellement jamais entendu parler d'avoir à les changer, ni vu quelqu'un faire leur.
Où
latin1
est venu, j'ai déposé un rapport de bug.Merci, cela confirme: mon problème est que j'ai utilisé accidentellement RASSEMBLER dans une situation où il n'y a pas des comparaisons de chaînes et les nombres comparés étaient convertir les chaînes à la volée, dans le 'latin1' ensemble, probablement un bug de MySQL qui vous avez déposé. Si vous voulez que comme une réponse distincte, je voudrais diviser le butin entre vous et Rick James. Merci les gars!
OriginalL'auteur Rick James