mysql: code d'erreur [1267]; Illégales mélange de classements (latin1_general_cs,IMPLICITE) et (latin1_swedish_ci,IMPLICITE) de l'opération '='
Je veux faire de la password
colonne de ma table User pour être case sensitive
dans mysql.
Qui suit est la description de la table:
/*Table: mst_user*/
FIELD TYPE COLLATION
------------- ------------ -----------------
user_id VARCHAR(100) latin1_swedish_ci
first_name VARCHAR(25) latin1_swedish_ci
last_name VARCHAR(25) latin1_swedish_ci
USER_PASSWORD VARCHAR(50) latin1_swedish_ci
user_status INT(11) (NULL)
version_id INT(11) (NULL)
active_status INT(11) (NULL)
user_type INT(11) (NULL)
Pour faire de la USER_PASSWORD
domaine sensible à la casse j'ai exécuté à la suite de la requête:
ALTER TABLE `mst_user` MODIFY `USER_PASSWORD` VARCHAR(50) COLLATE `latin1_general_cs`;
Cela a fonctionné, et le champ est maintenant sensible à la casse.
Mais j'ai un magasin de procédure qui exécute un SELECT
requête sur ce tableau pour vérifier si l'utilisateur existe, pour l'identification.
Stockées Proc::
CREATE PROCEDURE `usp_password_verify`(ip_login_id VARCHAR(200),
ip_user_password VARCHAR(200),
INOUT success INT(1),
INOUT tbl_usr_password VARCHAR(100),
INOUT pkg_user_password VARCHAR(100))
BEGIN
SELECT COUNT(*)
INTO success
FROM mst_user
WHERE UPPER (user_id) = UPPER (ip_login_id)
AND USER_PASSWORD=ip_user_password;
SET tbl_usr_password = '';
SET pkg_user_password= '';
END$$
Lorsque j'appelle cette procédure stockée à partir de mon code java, j'obtiens l'erreur suivante:
**error code [1267]; Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='**
Quelqu'un peut aider ce qui est mal à cela?
Quelque chose qui fonctionne comme une simple requête donne une erreur lors de l'exécution dans une procédure stockée!?
- Whoaaaa... ne pas stocker les mots de passe en clair! Magasin plutôt salé de hachage, de sorte que, dans le cas où votre base de données ne devient jamais compromise, il est difficile pour quiconque de découvrir de vos utilisateurs, les mots de passe. Voir Le guide définitif pour la base de formulaires authentification d'un site web pour plus d'informations.
- bien que va être ma prochaine étape... d'abord je tiens à obtenir par le biais de ce problème.. je veux avoir une sensibilité à la casse de vérifier et de se débarrasser de l'erreur mentionnée ci-dessus.
Vous devez vous connecter pour publier un commentaire.
Comme indiqué sous Classement des Expressions:
Vous pourrait ajouter une explicite
ASSEMBLER
clause dans votre expression de la force de l'un des opérandes d'avoir un classement explicite avec une baisse de la coercibility valeur:Vous pourriez même envisager
latin1_bin
dans ce cas?Dans tous les cas, vous ne doit pas être stocker les mots de passe en clair dans le texte. Au lieu de cela, magasin salé les hashs de mots de passe utilisateur et vérifiez simplement que le hachage correspond à ce qui est stocké.
USER_PASSWORD=ip_user_password COLLATE 'latin1_general_cs'
travaillé pour cela. Prochaine étape vous permettra de crypter le mot de passe. Merci les garsJe sais que c'est un peu tard, mais si cela pouvait sauver quelqu'un d'une demi-journée de prestation de serment, il est toujours intéressant de le mettre vers le bas.
Donc, mon installation était comme ça: 10.1.22-MariaDB,
utf8mb4_general_ci
.Du tout bon, j'ai restauré un dump de ma base de données, tout s'est bien passé.
La base de données a été à l'origine dans
utf8_general_ci
, mais pour certaines raisons, a été restauréutf8_unicode_ci
. Changé de retour àutf8_general_ci
et vérifié il n'y avait aucune trace dans la base de données, comme des colonnes ou des définitions de table compilées dans leutf8_unicode_ci
au lieu deutf8_general_ci
Essayer de mettre à jour une table spécifique a entraîné illégale d'un mélange de classement sans raison apparente.
Il est apparu à être, en fait, pas le tableau lui-même, mais les associés de déclenchement.
En fait le déclencheur appelé une procédure qui n'avait pas de classement d'infos dans ma base de données, mais qui avait un
utf8_unicode_ci
classement dansinformation_schema.ROUTINES.DATABASE_COLLATION
.Recréer la procédure dans le cadre du nouveau classement de base de données résolu mon problème.
Donc, après avoir lutté avec cette erreur:
J'ai réussi à résoudre ce problème en modifiant l'importation de fichier de base de données à partir de:
C'est le cas de l'importation des fonctions/procédures/déclencheurs, qui ma base de données a eu une tonne de toutes ces fonctionnalités... j'ai changé d':
CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
J'espère vraiment que cela aide quelqu'un. Je sais que le ci-dessus a été utile, mais encore, elle m'a fallu quelques heures pour le transformer en une solution. Grâce