Код ошибки 1267

I want to make the password column of my User table to be case sensitive in mysql.

Following is the description of the 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)    

To make the USER_PASSWORD field case sensitive I executed following query:

ALTER TABLE `mst_user` MODIFY `USER_PASSWORD` VARCHAR(50) COLLATE `latin1_general_cs`;

This worked and the field is now case sensitive.

But I have a store procedure which executes a SELECT query on this table to check if the user exists for the given credentials.

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

When I call this stored proc from my java code I am getting the following error:

**error code [1267]; Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='**

Can anyone help what is wrong with this?
Something that works as a simple query gives error while executing it in a stored proc!?

Andrew Curioso's user avatar

asked Nov 8, 2012 at 8:29

DarkKnightFan's user avatar

DarkKnightFanDarkKnightFan

1,91314 gold badges42 silver badges61 bronze badges

2

As documented under Collation of Expressions:

MySQL assigns coercibility values as follows:

[ deletia ]

  • The collation of a column or a stored routine parameter or local variable has a coercibility of 2.

[ deletia ]

MySQL uses coercibility values with the following rules to resolve ambiguities:

[ deletia ]

  • If both sides have the same coercibility, then:

    • If both sides are Unicode, or both sides are not Unicode, it is an error.

You could add an explicit COLLATE clause in your expression to force one of the operands to have an explicit collation with a lower coercibility value:

USER_PASSWORD=ip_user_password COLLATE 'latin1_general_cs'

You might even want to consider latin1_bin in this case?

In any event, you should not be storing passwords in plaintext. Instead, store salted hashes of your users’ passwords and simply verify that the hash matches that which is stored.

answered Nov 8, 2012 at 9:01

eggyal's user avatar

1

I came here after facing the same error. After going through the solutions provided it became apparent that the COLLATION was the trigger for my error. My code was similar to the original question but my error was MySQL said: #1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='.

I was trying to collect the password and username too (currently no hashing) and I fixed it by explicitly adding the COLLATION for both parameters.

First code (the erratic code):

WHERE user.username = username
AND user.password = password

My current code (the working code):

WHERE user.username = username COLLATE utf8mb4_0900_ai_ci
AND user.password = password COLLATE utf8mb4_0900_ai_ci

Adding a collation only to the password to force a collation match to username or adding only to the username didn’t work. Even though one parameter had the right collation to it already, it still had an error. So I added the same collation to both parameters and it worked.

Take note this is the actual COLLATION that is being used in my database already, but for some reason on procedure calls it wasn’t consistent.

Please do remember to salt/hash your passwords when you are done, my code is still a work in progress.

answered Mar 27, 2021 at 8:56

Wylie's user avatar

WylieWylie

3503 silver badges13 bronze badges

2

I know it’s a little bit late but if this could save someone half a day of swearing it’s still worth putting it down.

So, my setup was like this: 10.1.22-MariaDB, utf8mb4_general_ci.
All good, I restored a dump of my database, all went OK.

The database was originally in utf8_general_ci, but for some reasons was restored as utf8_unicode_ci. Changed that back to utf8_general_ci and checked there were no artifacts in the database like columns or table definitions collated as utf8_unicode_ci instead of utf8_general_ci

Trying to update a specific table resulted in an illegal mix of collation without any apparent reasons.

It boiled down to be in fact not the table itself but the associated trigger.

In fact the trigger called a procedure that had no collation info in my database, but that had a utf8_unicode_ci collation in information_schema.ROUTINES.DATABASE_COLLATION.

Recreating the procedure in the context of the new database collation solved my issue.

answered Jul 19, 2017 at 13:40

Radacina's user avatar

RadacinaRadacina

4315 silver badges10 bronze badges

So after struggling with this error:

ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_unicode_ci,COERCIBLE) and (utf8mb4_general_ci,COERCIBLE) for operation '='

I managed to fix this problem by changing the import database file from:

CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci NO SQL

This is if you are importing functions/procedures/triggers, which my database had a ton of all of these features… I changed that to:

CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

I really hope this helps someone. I know the above was helpful, but it still took me a few hours to turn that into a solution. Thanks

answered Nov 28, 2017 at 1:33

Ryan Jarvis's user avatar

Я разработал функцию с внутренним выражением IF. Функция работает нормально, пока она не попадет внутрь IF, где я получаю ошибку:

Код ошибки: 1267. Недопустимое сочетание сортировок (utf8_bin, IMPLICIT) и (latin1_swedish_ci, NUMERIC) для операции «<=».

Если я подавляю «<=», все работает нормально.

Я проверяю сортировку таблиц и базы данных, это utf8_bin, поэтому многие советы, уже прочитанные, не работают.

Есть идеи?

CREATE DEFINER='root'@'localhost' FUNCTION 'mutare_interval'(v_id_inspectie INT(10), v_user varchar(100),new_start_time varchar(100), new_end_time varchar(100), new_date DATE) RETURNS varchar(100) 
DETERMINISTIC
BEGIN

DECLARE v_mesaj VARCHAR(100);
DECLARE v_count VARCHAR(100);
DECLARE v_test VARCHAR(100);
DECLARE new_interval VARCHAR(100);
DECLARE old_start_time TIME;
DECLARE old_end_time TIME;
DECLARE old_date DATE;
DECLARE old_interval VARCHAR(100);
DECLARE old_user VARCHAR(100);

SET new_interval=concat ( left(new_start_time,5),'..',left(new_end_time,5),' ', new_date) COLLATE utf8_bin;

SELECT 
    start_time, end_time , start_date , CONCAT(LEFT(old_start_time, 5),
            '..',
            LEFT(old_end_time, 5),
            ' ',
            old_date) ,user INTO old_start_time, old_end_time, old_date, old_interval,old_user
FROM
    calendar
WHERE
    id_inspectie = v_id_inspectie;

SELECT 
    COUNT(*)
INTO v_count FROM
    calendar
WHERE
    user = v_user AND start_date = new_date
        AND (start_time<=new_end_time AND new_start_time<=end_time);

IF v_count=0 THEN 

-- facem update in Calendar pentru ca avem loc

UPDATE calendar SET start_time=new_start_time, end_time=new_end_time, start_date=new_date, end_date=new_date, user=v_user, 
start_date_time=CONCAT(new_date,' ',new_start_time), end_date_time=CONCAT(new_date,' ',new_end_time) WHERE id_inspectie=v_id_inspectie;

-- stergem intervalul vechi si cel nou in free time frames

DELETE FROM free_time_frames 
WHERE
    user_name = v_user
    AND LEFT(datestart , 10) = old_date
    AND (time_start<=old_end_time  AND old_start_time<=time_end);

DELETE FROM free_time_frames 
WHERE
    user_name = v_user
    AND LEFT(datestart , 10) = new_date
    AND (time_start <= new_end_time AND new_start_time <= time_end);

-- inserez intervale libere pe intervalul ramas liber (old)

INSERT INTO free_time_frames (interval_showv2,interval_show,id_activitate,durata_interval,time_start,time_end,datestart,
        dateend,dateendx,id,StartBreakLunch,EndBreakLunch,hh_name,wd,day_period,generation_time,user_name) 
        SELECT interval_showv2,interval_show,id_activitate,durata_interval,time_start,time_end,datestart,
        dateend,dateendx,id,StartBreakLunch,EndBreakLunch,hh_name,wd,day_period,generation_time,  old_user 
        FROM gth_ir.free_time_frames WHERE user_name='%ghost' AND LEFT(datestart,10)=old_date 
        AND (time_start <= old_end_time AND old_start_time <= time_end);


SET v_mesaj='Intervalul a fost modificat! ';

ELSE 

SET v_mesaj='Intervalul nu este eligibil! ';

END IF;
RETURN v_mesaj;
END

При установке IPB 3.4.x на 10 этапе, возникает ошибка.

Ошибка:

mySQL query error: SELECT id FROM faq, ГДЕ app=’core’ И title = ‘Поиск’ SQL error: Illegal сочетание параметров сортировки (latin1_swedish_ci,НЕЯВНЫЕ) и (utf8_general_ci,ПРИВОДИМЫЕ) для операции ‘=’ SQL код ошибки: 1267 Дата: среда 05 февраля 2014 года, 12:02:03 PM ———————————————————————————————————————————————————————————- Дата: ср, 05 февраля 2014 года, 12:02:03 +0000 Ошибка: 1267 — Незаконное сочетание параметров сортировки (latin1_swedish_ci,НЕЯВНЫЕ) и (utf8_general_ci,ПРИВОДИМЫЕ) для работы ‘=’ IP-Адрес: 127.0.0.1 — /admin/install/index.php?app=установить§ion=установить&do=acphelp ———————————————————————————————————————————————————————————- mySQL ошибка запроса: SELECT id FROM faq, ГДЕ app=’core’ И title = ‘Поиск’ .———————————————————————————————————————————————————————————. | Файл | Функции | No Line. | |—————————————————————————-+——————————————————————————-+——————-| | admin/setup/applications/install/sections/install.php | [admin_core_tools_help].helpFilesXMLImport_app | 1481 | ‘—————————————————————————-+——————————————————————————-+——————-‘ | admin/setup/applications/install/sections/install.php | [install_install].install_acphelp| 139 | ‘—————————————————————————-+——————————————————————————-+——————-‘ | admin/setup/sources/base/ipsController_setup.php | [install_install].doExecute| 258 | ‘—————————————————————————-+——————————————————————————-+——————-‘


Изменено пользователем Max321123

Для пользователей Mac: Шаг 1: Установите Android Studio

Шаг2: Откройте терминал и введите

cd

Шаг 3. Введите ниже указанную команду, изменив имя пользователя:

export PATH = «/ Users / userName / Library / Android / sdk / platform-tools»: $ PATH

задан OMG Ponies 27 February 2012 в 06:20

поделиться

7 ответов

SET collation_connection = 'utf8_general_ci';

, затем для ваших баз данных

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

MySQL иногда пробирается туда, где нет разумной причины.

ответ дан FreshPow 19 August 2018 в 00:02

поделиться

У меня была таблица, первоначально созданная с помощью CHARSET = latin1. После преобразования таблицы в utf8 некоторые столбцы не были преобразованы, однако это было не совсем очевидно. Вы можете попробовать запустить SHOW CREATE TABLE my_table; и посмотреть, какой столбец не был преобразован, или просто исправить неверный набор символов в проблемном столбце с запросом ниже (изменить длину varchar и CHARSET и COLLATE в соответствии с вашими потребностями):

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
 COLLATE utf8_general_ci NULL;

ответ дан A Kunin 19 August 2018 в 00:02

поделиться

CONVERT(column1 USING utf8)

Решает мою проблему. Где column1 — столбец, который дает мне эту ошибку.

ответ дан Binaya Shrestha 19 August 2018 в 00:02

поделиться

После внесения исправлений, перечисленных в верхнем ответе, измените настройки вашего сервера по умолчанию.

В вашем файле /etc/my.cnf.d/server.cnf или где он находится, добавьте по умолчанию используется раздел [mysqld], поэтому он выглядит так:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Источник: https://dev.mysql.com/doc/refman/5.7/en/charset-applications .html

ответ дан ITI 19 August 2018 в 00:02

поделиться

Вы должны установить для вашей кодировки таблицы и кодирования соединения значение UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

и

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

ответ дан Quassnoi 19 August 2018 в 00:02

поделиться

В общем, лучший способ — изменить сортировку таблицы. Однако у меня есть старое приложение и на самом деле не могу оценить результат, имеет ли это побочные эффекты. Поэтому я попытался каким-то образом преобразовать строку в другой формат, который решил проблему сортировки. То, что я нашел, — это выполнить сравнение строк, преобразуя строки в шестнадцатеричное представление его символов. В базе данных это делается с помощью HEX(column).. Для PHP вы можете использовать эту функцию:

public static function strToHex($string)
{
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}

При выполнении запроса базы данных исходная строка UTF8 должна быть сначала преобразована в строку iso (например, с помощью utf8_decode() в PHP), прежде чем использовать его в БД. Из-за типа сопоставления база данных не может содержать символы UTF8 внутри, поэтому сравнение должно работать, хотя это изменяет исходную строку (преобразование символов UTF8, которые не встречаются в символьной кодировке ISO, приводит к? Или они полностью удаляются). Просто убедитесь, что при записи данных в базу данных вы используете одно и то же преобразование UTF8 в ISO.

ответ дан Stephan 19 August 2018 в 00:02

поделиться

Используйте следующую инструкцию для ошибки

, будьте осторожны, когда ваши данные берут резервную копию, если данные содержатся в таблице.

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

ответ дан vpgodara 19 August 2018 в 00:02

поделиться

Другие вопросы по тегам:

Похожие вопросы:

Я хочу сделать password столбец моей таблицы пользователя будет case sensitive в mysql.

Ниже приводится описание таблицы:

/*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)    

Чтобы сделать USER_PASSWORD чувствительно к регистру я выполнил следующий запрос:

ALTER TABLE `mst_user` MODIFY `USER_PASSWORD` VARCHAR(50) COLLATE `latin1_general_cs`;

Это сработало, и поле теперь чувствительно к регистру.

Но у меня есть процедура магазина, которая выполняет SELECT запрос к этой таблице, чтобы проверить, существует ли пользователь для данных учетных данных.

Сохраненный процесс::

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

Когда я вызываю этот хранимый процесс из моего кода Java, я получаю следующую ошибку:

**error code [1267]; Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='**

Может кто-нибудь помочь, что не так с этим? Что-то, что работает как простой запрос, выдает ошибку при выполнении его в хранимой процедуре!?

2012-11-08 08:29

4
ответа

Решение

Как задокументировано в разделе Сборка выражений:

MySQL назначает значения принудительности следующим образом:

[ deletia ]

  • Параметры сортировки столбца, хранимого стандартного параметра или локальной переменной имеют значение 2.

[ deletia ]

MySQL использует значения принудительной совместимости со следующими правилами для устранения неоднозначностей:

[ deletia ]

  • Если обе стороны имеют одинаковое принуждение, то:

    • Если обе стороны Unicode или обе стороны не Unicode, это ошибка.

Вы можете добавить явное COLLATE предложение в вашем выражении, чтобы заставить один из операндов иметь явное сопоставление с более низким значением принудительности:

USER_PASSWORD=ip_user_password COLLATE 'latin1_general_cs'

Вы могли бы даже хотеть рассмотреть latin1_bin в этом случае?

В любом случае, вы не должны хранить пароли в открытом виде. Вместо этого храните соленые хэши паролей ваших пользователей и просто проверяйте, совпадает ли хеш с тем, который хранится.

2012-11-08 09:01

Я пришел сюда после того, как столкнулся с той же ошибкой. После рассмотрения предложенных решений стало очевидно, что СБОРКА была причиной моей ошибки. Мой код был похож на исходный вопрос, но моя ошибка была
MySQL said: #1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='.

Я тоже пытался собрать пароль и имя пользователя (в настоящее время нет хеширования), и я исправил это, явно добавив COLLATION для обоих параметров.

Первый код (ошибочный код):

      WHERE user.username = username
AND user.password = password

Мой текущий код (рабочий код):

      WHERE user.username = username COLLATE utf8mb4_0900_ai_ci
AND user.password = password COLLATE utf8mb4_0900_ai_ci

Добавление сопоставления только к паролю для принудительного сопоставления сопоставления с именем пользователя или добавление только к имени пользователя не сработало. Несмотря на то, что для одного параметра уже было правильное сопоставление, по-прежнему была ошибка. Поэтому я добавил одинаковые параметры сортировки к обоим параметрам, и это сработало.

Обратите внимание, что это фактическая COLLATION, которая уже используется в моей базе данных, но по какой-то причине при вызовах процедур она не согласовывалась.

Пожалуйста, не забудьте солить / хешировать свои пароли, когда вы закончите, мой код все еще находится в стадии разработки.

2021-03-27 11:56

Я знаю, что уже немного поздно, но если это может сэкономить кому-то полдня клятвы, все равно стоит от него отказаться.

Итак, моя установка была такой: 10.1.22-MariaDB, utf8mb4_general_ci, Все хорошо, я восстановил дамп своей базы данных, все прошло нормально.

База данных изначально была в utf8_general_ci, но по ряду причин был восстановлен как utf8_unicode_ci, Изменил это обратно utf8_general_ci и проверил, что в базе данных нет артефактов, таких как столбцы или определения таблиц, сопоставленные как utf8_unicode_ci вместо utf8_general_ci

Попытка обновить конкретную таблицу привела к недопустимому сочетанию параметров сортировки без видимых причин.

Это сводилось к тому, чтобы быть фактически не самой таблицей, а связанным триггером.

На самом деле триггер вызвал процедуру, которая не имела информации о сопоставлении в моей базе данных, но имела utf8_unicode_ci сопоставление в information_schema.ROUTINES.DATABASE_COLLATION,

Воссоздание процедуры в контексте новой базы данных сопоставления решило мою проблему.

2017-07-19 13:40

Итак, после борьбы с этой ошибкой:

ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_unicode_ci,COERCIBLE) and (utf8mb4_general_ci,COERCIBLE) for operation '='

Мне удалось решить эту проблему, изменив файл базы данных импорта с:

CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci NO SQL

Это если вы импортируете функции / процедуры / триггеры, у которых в моей базе данных было множество этих функций… Я изменил это на:

CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

Я действительно надеюсь, что это кому-то поможет. Я знаю, что вышеупомянутое было полезно, но мне все еще потребовалось несколько часов, чтобы превратить это в решение. Спасибо

2017-11-28 01:33

Понравилась статья? Поделить с друзьями:
  • Код ошибки 128 некорректная сумма налога
  • Код ошибки 1265
  • Код ошибки 1301 ваз 2114
  • Код ошибки 1262
  • Код ошибки 128 опель инсигния