Mysql ошибка 1271

I’ve various tables for storing comments of various parts of a website that have the same structure. I want to moderate the comments on the admin panel but I can’t do a page for each, so I want to select it all and then LIMIT it. I asked how to do this here on SO and they solved my question but I get the error: 1271 — Illegal mix of collations for operation ‘UNION’.

SELECT  *
FROM    (
        SELECT  *
        FROM    (
                SELECT  *
                FROM  noticias_comentarios
                ORDER BY
                        ts_creado DESC
                LIMIT 10
                ) q
        UNION ALL
        SELECT  *
        FROM    (
                SELECT  *
                FROM carruseles_comentarios
                ORDER BY
                        ts_creado DESC
                LIMIT 10
                ) q
        ) q
JOIN    usuarios u
ON      u.id = q.id_usuario
ORDER BY
        ts_creado DESC
LIMIT   0, 10

All the 3 tables have the character set utf8 and the collation utf8_spanish_ci.

How can I solve it?

Thank you in advance.

UPDATED with the answer of Larry:

SELECT  *
FROM    (
   SELECT id, id_noticia, id_usuario, comentario, ts_creado
   FROM  noticias_comentarios
   ORDER BY ts_creado DESC
   LIMIT 0, 10
  UNION ALL
   SELECT id, id_carrusel, id_usuario, comentario, ts_creado
   FROM carruseles_comentarios
   ORDER BY  ts_creado DESC
   LIMIT 0, 10
  ) q
JOIN    usuarios u  ON u.id = q.id_usuario
ORDER BY ts_creado DESC
LIMIT   0, 10

Now produces the error: 1221 — Incorrect usage of UNION and ORDER BY

@tonyarnold


MySQL Error (1271): Illegal mix of collations for operation 'UNION' in query "(SELECT t1.`subsection_id`, t1.field_id
         FROM `sym_fields_subsectionmanager` AS t1
          INNER JOIN `sym_fields` AS t2
          WHERE t2.`element_name` = 'sidebar-image'
           AND t2.`parent_section` = '38' 
         AND t1.`field_id` = t2.`id`
          LIMIT 1)
       UNION
        (SELECT t1.`subsection_id`, t1.field_id
          FROM `sym_fields_subsectiontabs` AS t1
         INNER JOIN `sym_fields` AS t2
          WHERE t2.`element_name` = 'sidebar-image'
           AND t2.`parent_section` = '38' 
         AND t1.`field_id` = t2.`id`
          LIMIT 1)
       LIMIT 1"

I’m seeing this when querying a datasource containing an subsection that only allows a single entry. What information can I provide to help track this down (and potentially fix it myself). I don’t know enough about SSM at this point to make an educated guess :(

@brendo

It means the two tables have been created in different encodings. You’ll probably find one is latin1 and one is utf8.

Curiously, this has been occurring more of late I can’t pick why as there have been no core level changes to trigger this. Perhaps we are just at that tipping point where half the extensions specify UTF8 and half specify nothing.

Or it might coincide with a recent MySQL update.

@tonyarnold



Copy link


Contributor


Author

That was exactly it. I think I went the wrong way and removed the specified collation from the tables being compared, but it works now.

@nilshoerrmann

Just so I get this right: this is not a problem caused by Subsection Manager? It’s either caused by Symphony or manual database changes?! I’m a bit confused at the moment.

@tonyarnold



Copy link


Contributor


Author

It’s not SSM. It does need addressing, but it’s a bit of a manual change for everyone who is including SQL in their extensions.

I’ll need to get @brendo to explain it in a way that makes sense — basically, MySQL defaults are conflicting with the SQL in some extensions (depending on your MySQL server’s configuration) which specify strict collations. It’s not really my area of expertise, so I’d need to do more reading to not make a balls-up of the explaining.

@nilshoerrmann

Additional question: Are you using an build that has been updated from Subsection Manager 1 to 2? In this case the tables sym_fields_subsectionmanager (version 1) and sym_fields_subsectiontabs (version 2) would have been created at different times – maybe this is a source of this problem?

@tonyarnold



Copy link


Contributor


Author

Good call: yes, I am. I updated it today. That could definitely be the cause of the collation changes.

Ошибка 1271 (HY000): Несовместное смешивание кодировки при операции ‘=’ в MySQL

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

Однако, как и любое программное обеспечение, у MySQL есть свои ограничения и возможные проблемы. Одной из возможных ошибок, с которыми разработчик может столкнуться, является «Ошибка 1271 (HY000): Несовместное смешивание кодировки при операции ‘='».

Проблема возникает в том случае, когда MySQL не может выполнить операцию сравнения (=) на столбцах с разными кодировками. Это означает, что два столбца, с которыми вы хотите сравнить друг друга при использовании оператора «=», имеют разные кодировки.

Кодировки в MySQL представляют собой способ представления символов и набор правил для их интерпретации и сохранения.

В MySQL существует множество поддерживаемых кодировок, таких как ASCII, UTF-8, Latin1 и другие. Каждая кодировка имеет свои особенности и предназначена для использования в конкретных случаях.

По умолчанию MySQL использует кодировку базы данных, указанную при ее создании. Это означает, что все столбцы в этой базе данных будут иметь ту же кодировку. Если вам нужны разные кодировки для разных столбцов, вы должны явно указать это при создании таблицы.

Теперь рассмотрим пример с ошибкой 1271 в MySQL.

Прежде всего, предположим, что у нас есть две таблицы — «table1» и «table2». В «table1» есть столбец «column1» с кодировкой UTF-8, а в «table2» есть столбец «column2» с кодировкой Latin1. Попробуем выполнить следующий SQL-запрос:

SELECT * FROM table1 WHERE column1 = (SELECT column2 FROM table2);

В результате выполнения этого запроса мы получим ошибку: ERROR 1271 (HY000): Illegal mix of collations for operation ‘=’.

Эта ошибка возникает потому, что MySQL не может выполнить операцию сравнения (=) между столбцами с разными кодировками.

Теперь давайте посмотрим на несколько способов решения этой проблемы.

1. Изменение кодировки столбца
В этом случае мы можем изменить кодировку одного из столбцов так, чтобы он совпадал с кодировкой другого. Например, мы можем изменить кодировку столбца «column2» в «table2» на UTF-8, чтобы она соответствовала кодировке «column1» в «table1».

ALTER TABLE table2 MODIFY column2 VARCHAR(255) CHARACTER SET utf8;

2. Использование оператора COLLATE
Если нам необходимо сохранить разные кодировки для столбцов, мы можем использовать оператор COLLATE, чтобы явно указать, какую кодировку использовать при выполнении операции сравнения.

SELECT * FROM table1 WHERE column1 COLLATE utf8_general_ci = (SELECT column2 FROM table2);

В этом примере мы использовали направленное изменение коллации utf8_general_ci для столбца «column1» в операторе сравнения. Это позволяет MySQL разрешить операцию сравнения между столбцами с разными кодировками.

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

ALTER DATABASE your_database_name CHARACTER SET utf8;

Эта команда изменит кодировку базы данных «your_database_name» на UTF-8. В результате все новые таблицы будут созданы с указанной кодировкой.

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

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

Надеюсь, что данная статья помогла вам понять появление ошибки 1271 (HY000) и дала вам инструменты для решения данной проблемы в MySQL. Успешной работы с базами данных!

Получаем ошибку ниже при попытке выполнить выбор в хранимой процедуре в MySQL.

Нелегальное сочетание сортировок (latin1_general_cs, IMPLICIT) и (latin1_general_ci, IMPLICIT) для операции ‘=’

Любая идея о том, что здесь может быть неправильным?

Сравнение таблицы latin1_general_ci, а столбца в предложении where — latin1_general_cs.

Ответ 1

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

Предложение COLLATE позволяет указать параметры сортировки, используемые в запросе.

Например, следующее предложение WHERE всегда будет содержать сообщение об ошибке, которую вы опубликовали:

WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs

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

SELECT * FROM table ORDER BY key COLLATE latin1_general_ci;

Другой вариант — использовать оператор BINARY:

BINARY str — сокращение от CAST (st как AS BINARY).

Ваше решение может выглядеть примерно так:

SELECT * FROM table WHERE BINARY a = BINARY b;

или

SELECT * FROM table ORDER BY BINARY a;

Ответ 2

TL; DR

Либо измените сопоставление одного (или обоих) строк так, чтобы они соответствовали, либо добавили в выражение выражение COLLATE.


  • Что это за «сортировка» в любом случае?

    Как описано в Наборы символов и сортировки в целом:

    A набор символов представляет собой набор символов и кодировок. сопоставление — это набор правил для сравнения символов в наборе символов. Позвольте сделать различие понятным на примере мнимого набора символов.

    Предположим, что у нас есть алфавит с четырьмя буквами: «A» , «B» , «A» , «B» . Мы даем каждой букве число: «A» = 0, «B» = 1, «A» = 2, «B» = 3. Буква «A» является символом, число 0 является кодировкой для «A» , а комбинация всех четырех букв и их кодировок — это набор символов .

    Предположим, что мы хотим сравнить два строковых значения: «A» и «B» . Самый простой способ сделать это — посмотреть кодировки: 0 для «A» и 1 для «B» . Поскольку 0 меньше 1, мы говорим: «A» меньше «B» . Мы только что применили сопоставление с нашим набором символов. Сопоставление — это набор правил (только одно правило в этом случае): «сравнить кодировки». Мы называем это простейшее из всех возможных сопоставлений двоичным сопоставлением.

    Но что, если мы хотим сказать, что строчные и прописные буквы эквивалентны? Тогда у нас будет по крайней мере два правила: (1) обрабатывать строчные буквы «A» и «B» как эквивалентные «A» и «B» ; (2), затем сравните кодировки. Мы называем это нечувствительным к регистру сопоставлением. Это немного сложнее, чем двоичная сортировка.

    В реальной жизни большинство наборов символов имеют много символов: не только «A» и «B» , но целые алфавиты, иногда несколько алфавитов или восточные системы письма с тысячами символов, а также множество специальных символов и знаков препинания Метки. Кроме того, в реальной жизни большинство коллайлов имеют много правил, а не только для того, чтобы различать буквенный регистр, но также и для того, чтобы отличить акценты ( «акцент» — это знак, прикрепленный к персонажу, как на немецком языке «Ö» ), и для многосимвольные сопоставления (например, правило «Ö» = «OE» в одном из двух германских сопоставлений).

    Другие примеры приведены в примерах эффекта сортировки.

  • Хорошо, но как MySQL решает, какое сопоставление использовать для данного выражения?

    Как описано в Сочетание выражений:

    В подавляющем большинстве утверждений очевидно, что используется MySQL для сопоставления операции сравнения. Например, в следующих случаях должно быть ясно, что сортировка — это сортировка столбца charset_name:

    SELECT x FROM T ORDER BY x;
    SELECT x FROM T WHERE x = x;
    SELECT DISTINCT x FROM T;
    

    Однако с несколькими операндами может быть неоднозначность. Например:

    SELECT x FROM T WHERE x = 'Y';
    

    Если сравнение использует сортировку столбца x или строкового литерала 'Y'? Оба x и 'Y' имеют сопоставления, так что сопоставление имеет приоритет?

    Стандартный SQL разрешает такие вопросы, используя то, что раньше называлось правилами «принуждаемости».

    [ deletia ]

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

    • Используйте сопоставление с наименьшим значением принуждения.

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

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

      • Если одна из сторон имеет набор символов Unicode, а другая сторона имеет набор символов, отличных от Юникода, выигрывает сторона с символьным набором Unicode, а автоматическое преобразование набора символов применяется к стороне, отличной от Юникода. Например, следующий оператор не возвращает ошибку:

        SELECT CONCAT(utf8_column, latin1_column) FROM t1;
        

        Он возвращает результат, имеющий набор символов utf8 и ту же сортировку, что и utf8_column. Значения latin1_column автоматически преобразуются в utf8 перед конкатенацией.

      • Для операции с операндами из того же набора символов, но которые смешивают сортировку _bin и a _ci или _cs, используется сортировка _bin. Это похоже на то, как операции, в которых смешиваются недвоичные и двоичные строки, оценивают операнды как двоичные строки, за исключением того, что они предназначены для сопоставлений, а не для типов данных.

  • Итак, что такое «незаконное сочетание сортировок»?

    «Неправильное сочетание сопоставлений» возникает, когда выражение сравнивает две строки разных сопоставлений, но имеет равную совместимость, а правила принуждения не могут помочь разрешить конфликт. Эта ситуация описана в третьей цитате в приведенной выше цитате.

    Конкретная ошибка, заданная в вопросе Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '=', говорит нам о том, что было проведено сравнение равенства между двумя строками, не относящимися к Unicode, с равной совместимостью. Кроме того, он говорит нам, что сопоставления не были указаны явно в заявлении, а скорее подразумевались из источников строк (например, метаданных столбца).

  • Все это очень хорошо, но как решить такие ошибки?

    Как показывают приведенные выше выдержки из руководства, эта проблема может быть решена несколькими способами, из которых два являются разумными и рекомендуемыми:

    • Измените сортировку одной (или обеих) строк так, чтобы они совпадали, и больше не существует двусмысленности.

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

    • Настроить одну строку, чтобы она не была принудительной.

      Я пропустил следующую цитату из вышеперечисленного:

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

      • Явное предложение COLLATE обладает способностью к нулю (не является коэрцитивной).

      • Конкатенация двух строк с разными сопоставлениями имеет коэрцитивность 1.

      • Сопоставление столбца или параметра хранимой процедуры или локальной переменной имеет совместимость с 2.

      • «Системная константа» (строка, возвращаемая такими функциями, как USER() или VERSION()) обладает способностью 3.

      • Сопоставление литерала имеет коэрцитивность 4.

      • NULL или выражение, полученное из NULL, имеет коэрцитивность 5.

      Таким образом, просто добавление предложения COLLATE в одну из строк, используемых при сравнении, заставит использовать эту сортировку.

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

    • Принудите одну (или обе) строки к некоторым другим значениям коэрцитивности, чтобы иметь преимущество.

      Использование CONCAT() или CONCAT_WS() приведет к тому, что строка с способностью 1; и (если в хранимой процедуре) использование параметров/локальных переменных приведет к строкам с способностью 2.

    • Измените кодировку одной (или обеих) строк так, чтобы она была Unicode, а другая — не.

      Это можно сделать путем перекодирования с помощью CONVERT(expr USING transcoding_name); или путем изменения базового набора символов (например, изменение столбца, изменение character_set_connection для литеральных значений или отправка их с клиента в другую кодировку и изменение character_set_client/добавление средства ввода символов). Обратите внимание, что изменение кодировки приведет к другим проблемам, если некоторые желаемые символы не могут быть закодированы в новом наборе символов.

    • Измените кодировки одной (или обеих) строк так, чтобы они были одинаковыми и изменили одну строку, чтобы использовать соответствующую сортировку _bin.

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

Ответ 3

Добавление моего 2c к обсуждению будущих googlers.

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

Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and 
(utf8_general_ci,IMPLICIT) for operation '='

Используя следующий запрос:

mysql> show variables like "collation_database";
    +--------------------+-----------------+
    | Variable_name      | Value           |
    +--------------------+-----------------+
    | collation_database | utf8_general_ci |
    +--------------------+-----------------+

Я смог сказать, что БД использовала utf8_general_ci, а таблицы были определены с помощью utf8_unicode_ci:

mysql> show table status;
    +--------------+-----------------+
    | Name         | Collation       |
    +--------------+-----------------+
    | my_view      | NULL            |
    | my_table     | utf8_unicode_ci |
    ...

Обратите внимание, что представления имеют NULL-сопоставление. Похоже, что представления и функции имеют определения сортировки, хотя этот запрос показывает null для одного представления. Используемая сортировка — это сортировка БД, которая была определена при создании представления/функции.

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

  • Изменение сортировки db:

    ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;
    

Надеюсь, это поможет кому-то.

Ответ 4

Иногда бывает сложно конвертировать кодировки, особенно в базы данных с огромным количеством данных. Я думаю, что лучший вариант — использовать «двоичный» оператор:

e.g : WHERE binary table1.column1 = binary table2.column1

Ответ 5

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

SET @my_var = 'string1,string2';
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);

и получал ошибку

Код ошибки: 1267. Недопустимое сочетание сортировок (utf8_unicode_ci, IMPLICIT) и (utf8_general_ci, IMPLICIT) для операции «find_in_set»

Короткий ответ:

Не нужно менять переменные collation_YYYY, просто добавьте правильную сортировку рядом с объявлением переменной, т.е.

SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);

Длинный ответ:

Сначала я проверил переменные сортировки:

mysql> SHOW VARIABLES LIKE 'collation%';
    +----------------------+-----------------+
    | Variable_name        | Value           |
    +----------------------+-----------------+
    | collation_connection | utf8_general_ci |
    +----------------------+-----------------+
    | collation_database   | utf8_general_ci |
    +----------------------+-----------------+
    | collation_server     | utf8_general_ci |
    +----------------------+-----------------+

Затем я проверил сортировку таблицы:

mysql> SHOW CREATE TABLE my_table;

CREATE TABLE `my_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `column_name` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Это означает, что моя переменная была настроена со значением по умолчанию utf8_general_ci, тогда как моя таблица была настроена как utf8_unicode_ci.

Добавив команду COLLATE рядом с объявлением переменной, сопоставление переменных соответствовало настройке сопоставления для таблицы.

Ответ 6

Вы можете попробовать этот script, который преобразует все ваши базы данных и таблицы в utf8.

Ответ 7

Решение, если речь идет о литералах.

Я использую интеграцию данных Pentaho и не могу указать синтаксис sql.
Использование очень простого поиска в БД дало ошибку
Msgstr «Недействительное сочетание сортировок (cp850_general_ci, COERCIBLE) и (latin1_swedish_ci, COERCIBLE) для операции ‘=’»

Сгенерированный код был
«SELECT DATA_DATE AS last_DATA_DATE FROM hr_cc_normalised_data_date_v WHERE PSEUDO_KEY =?»

Сокращение истории сократило поиск до представления, и когда я выпустил

mysql> show full columns from hr_cc_normalised_data_date_v;
+------------+------------+-------------------+------+-----+
| Field      | Type       | Collation         | Null | Key |
+------------+------------+-------------------+------+-----+
| PSEUDO_KEY | varchar(1) | cp850_general_ci  | NO   |     |
| DATA_DATE  | varchar(8) | latin1_general_cs | YES  |     |
+------------+------------+-------------------+------+-----+

который объясняет, откуда берется «cp850_general_ci».

Вид был просто создан с помощью ‘SELECT’ X ‘,……’
В соответствии с такими литералами, как это, следует наследовать их набор символов и сортировку из настроек сервера, которые были правильно определены как «latin1» и «latin1_general_cs»,
так как этого явно не случилось, я заставил его создать вид

CREATE OR REPLACE VIEW hr_cc_normalised_data_date_v AS
SELECT convert('X' using latin1) COLLATE latin1_general_cs        AS PSEUDO_KEY
    ,  DATA_DATE
FROM HR_COSTCENTRE_NORMALISED_mV
LIMIT 1;

теперь он показывает latin1_general_cs для обоих столбцов, и ошибка исчезла.:)

Ответ 8

MySQL действительно не любит смешивать сортировки, если только он не может принудить их к одному (что явно не возможно в вашем случае). Не можете ли вы просто заставить ту же сортировку использовать предложение COLLATE? (или более простой BINARY ярлык, если применимо…).

Ответ 9

Если столбцы, с которыми у вас возникают проблемы, являются «хэшами», тогда рассмотрим следующее…

Если «хэш» является двоичной строкой, вы действительно должны использовать тип данных BINARY(...).

Если «хеш» — это шестнадцатеричная строка, вам не нужно utf8, и этого следует избегать из-за проверки символов и т.д. Например, MySQL MD5(...) дает 32-байтовую строку с фиксированной длиной. SHA1(...) дает 40-байтовую шестую строку. Это можно сохранить в CHAR(32) CHARACTER SET ascii (или 40 для sha1).

Или, еще лучше, сохраните UNHEX(MD5(...)) в BINARY(16). Это уменьшает половину размера столбца. (Тем не менее, это делает его непечатаемым.) SELECT HEX(hash) ..., если вы хотите, чтобы он был читабельным.

Сравнение двух столбцов BINARY не имеет проблем с сортировкой.

Ответ 10

Возможное решение: конвертировать всю базу данных в UTF8 (см. также question).

Ответ 11

Другим источником проблемы с сопоставлениями является таблица mysql.proc. Проверьте сортировки ваших процедур хранения и функций:

SELECT
  p.db, p.db_collation, p.type, COUNT(*) cnt
FROM mysql.proc p
GROUP BY p.db, p.db_collation, p.type;

Также обратите внимание на столбцы mysql.proc.collation_connection и mysql.proc.character_set_client.

Ответ 12

Если у вас установлен phpMyAdmin, вы можете следовать инструкциям, приведенным в следующей ссылке: https://mediatemple.net/community/products/dv/204403914/default-mysql-character-set-and-collation Необходимо сопоставить сопоставление базы данных с сопоставлением всех таблиц, а также полей таблиц, а затем перекомпилировать все сохраненные данные. процедуры и функции. С этим все должно работать снова.

Ответ 13

Я использовал ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;, но не работал.

В этом запросе:

Select * from table1, table2 where table1.field = date_format(table2.field,'%H');

Эта работа для меня:

Select * from table1, table2 where concat(table1.field) = date_format(table2.field,'%H');

Да, только concat.

Ответ 14

Этот код необходимо поместить внутри Запустить SQL-запрос/запросы в базе данных

SQL QUERY WINDOW

ALTER TABLE `table_name` CHANGE `column_name` `column_name`   VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL;

Пожалуйста, замените имя_таблицы и имя_столбца соответствующим именем.

 

Сайт давно не обновлялся, стоял на старом php5.3 и само обновление сайта от 17 года. Поставил 7.3 работал нормально, обновил до последней версии до конца не обновилось и полетело все.
С такой ошибкой
[Bitrix\Main\DB\SqlQueryException]
Mysql query error: (1271) Illegal mix of collations for operation ‘UNI ON’ (400)

SEL ECT NULL AS SITE_ID, NAME, VALUE
FR OM b_option
WHERE MODULE_ID = ‘main’
UNION
SEL ECT SITE_ID, NAME, VALUE
FR OM b_option_site
WH ERE MODULE_ID = ‘main’

/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/db/mysqliconnection.php:137
#0: Bitrix\Main\DB\MysqliConnection->queryInternal(string, array, NULL)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/db/connection.php:330
#1: Bitrix\Main\DB\Connection->query(string)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/config/option.php:200
#2: Bitrix\Main\Config\Option::load(string)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/config/option.php:38
#3: Bitrix\Main\Config\Option::get(string, string, string)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/httprequest.php:392
#4: Bitrix\Main\HttpRequest->prepareCookie(array)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/httprequest.php:69
#5: Bitrix\Main\HttpRequest->__construct(object, array, array, array, array)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/httpapplication.php:46
#6: Bitrix\Main\HttpApplication->initializeContext(array)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/lib/application.php:122
#7: Bitrix\Main\Application->initializeExtendedKernel(array)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/include.php:22
#8: require_once(string)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/include/prolog_before.php:14
#9: require_once(string)
/var/www/vhosts/site.ru/httpdocs/bitrix/modules/main/include/prolog.php:10
#10: require_once(string)
/var/www/vhosts/site.ru/httpdocs/bitrix/header.php:1
#11: require(string)
/var/www/vhosts/site.ru/httpdocs/index.php:2

Пытался сменить кодировку на utf8_unicode_ci не помогло, помогите пожалуйста решить проблему

 

Пользователь 2856829

Постоянный посетитель

Сообщений: 8
Баллов: 18
Регистрация: 24.01.2019

#2

30.09.2019 11:19:06

Зайдите в используемую бд и выполните:

ALTER слитно

Код
ALT ER   TABLE b_option_site CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
 

Пользователь 125357

Постоянный посетитель

Сообщений: 152
Баллов: 18
Регистрация: 23.04.2012

#3

01.10.2019 16:38:54

Спасибо! Реально решилась проблема.

Идем на хостинг в phpMyAdmin

и выполняем запрос в SQL

Код
ALT ER   TABLE b_option_site CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

В начале ALTER слитно

Нужен проект или доработка? Пиши в личку, я всегда на связи! Скайп — sangro0307

 

Спасибо! + к карме, тоже помогло!

 
 

Человеческое спасибо. Помогло. +1

 
 
 

Пользователь 2560551

Заглянувший

Сообщений: 1
Регистрация: 22.08.2019

#9

11.12.2019 16:14:39

Цитата
Виталий Шестаков написал:
Зайдите в используемую бд и выполните:

ALTER слитно

Код
 ALT ER   TABLE b_option_site CONVERT TO CHARACTER   SET  utf8  COLLATE  utf8_unicode_ci; 
 

Спасибо, добрый человек!

 
 

Спасибо, добрый человек и от меня!

 
 
 
 
 
 

Пользователь 64241

Заглянувший

Сообщений: 7
Регистрация: 27.05.2010

#17

30.03.2020 13:21:41

Цитата
Виталий Шестаков написал:
Зайдите в используемую бд и выполните:

ALTER слитно

Код
 ALT ER   TABLE b_option_site CONVERT TO CHARACTER   SET  utf8  COLLATE  utf8_unicode_ci; 
 

Спасибо большое!

С уважением,
Нефедов Александр

 

Добрый день.
Была ошибка «Mysql query error: (1271) Illegal mix of collations for operation ‘UNION’ (400)»
После выполнения в SQL указанного выше запроса ошибка на сайте стала такой:

[Bitrix\Main\DB\ConnectionException] Mysql connect error [h812298539.mysql]: (1045) Access denied for user ‘h812298539_fit’@’10.12.2.156’ (using password: YES) (400)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/db/mysqliconnection.php:65
#0: Bitrix\Main\DB\MysqliConnection->connectInternal()
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/data/connection.php:53
#1: Bitrix\Main\Data\Connection->getResource()
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/db/mysqlisqlhelper.php:21
#2: Bitrix\Main\DB\MysqliSqlHelper->forSql(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/config/option.php:191
#3: Bitrix\Main\Config\Option::load(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/config/option.php:38
#4: Bitrix\Main\Config\Option::get(string, string, string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/httprequest.php:392
#5: Bitrix\Main\HttpRequest->prepareCookie(array)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/httprequest.php:69
#6: Bitrix\Main\HttpRequest->__construct(object, array, array, array, array)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/httpapplication.php:46
#7: Bitrix\Main\HttpApplication->initializeContext(array)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/lib/application.php:122
#8: Bitrix\Main\Application->initializeExtendedKernel(array)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/include.php:22
#9: require_once(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/include/prolog_before.php:14
#10: require_once(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/include/prolog.php:10
#11: require_once(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/header.php:1
#12: require(string)
/home/h812298539/h812298539.nichost.ru/docs/index.php:2

Подскажите, пожалуйста, в чем может быть дело?
P.S. Да, я восстановила пароль к БД. Но куда его записать теперь, новый пароль, не пойму

 

Пользователь 136059

Гуру

Сообщений: 5439
Баллов: 1077
Регистрация: 16.07.2012

#19

09.04.2020 15:13:08

Цитата
Олеся Крамаренко написал:
P.S. Да, я восстановила пароль к БД. Но куда его записать теперь, новый пароль, не пойму

Файлы /bitrix/.settings.php и /bitrix/php_interface/dbconn.php

Голосуй за идеи по развитию API Bitrix:
https://idea.1c-bitrix.ru/26707/
https://idea.1c-bitrix.ru/26709/
https://idea.1c-bitrix.ru/the-local-extension-folder-js/

 

Пользователь 1544393

Заглянувший

Сообщений: 2
Регистрация: 16.03.2018

#20

11.04.2020 11:16:21

Цитата
Андрей Николаев написал:

Цитата
Олеся Крамаренко  написал:
P.S. Да, я восстановила пароль к БД. Но куда его записать теперь, новый пароль, не пойму

Файлы /bitrix/.settings.php и /bitrix/php_interface/dbconn.php

Спасибо, нашла.
Теперь ошибка такого рода:
[Error] Call to undefined function mysql_query() (0)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/classes/mysql/database_mysql.php:47
#0: CDatabase->QueryInternal(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/classes/mysql/database.php:161
#1: CDatabaseMysql->Query(string, boolean, string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/classes/mysql/main.php:96
#2: CMain->GetLang()
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/include.php:47
#3: require_once(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/include/prolog_before.php:14
#4: require_once(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/modules/main/include/prolog.php:10
#5: require_once(string)
/home/h812298539/h812298539.nichost.ru/docs/bitrix/header.php:1
#6: require(string)
/home/h812298539/h812298539.nichost.ru/docs/index.php:2
Даже нет номера ошибки, что бы загуглить

 

Пользователь 180446

Эксперт

Сообщений: 684
Баллов: 92
Регистрация: 11.04.2013

#21

11.04.2020 12:22:55

Цитата
Олеся Крамаренко написал:
Даже нет номера ошибки, что бы загуглить

Олесь, это отговорки. Не нужен номер, используй текст

Код
Call to undefined function mysql_query
 
 

После ввода запроса админка вернулась, но появилась другая ошибка

Fatal error: Cannot use intec\core\base\Object as Object because ‘Object’ is a special class name in /var/www/www-root/data/www/red34025.rdock.ru/bitrix/modules/intec.constructorlite/classes/models/Build.php on line 6

Вообще изначально делалось обновление Битрикса, модулей. На половине отвалился.

 

Пользователь 2090153

Постоянный посетитель

Сообщений: 193
Баллов: 33
Регистрация: 11.06.2018

#24

05.06.2020 13:05:33

Цитата
Константин Синильников написал:
После ввода запроса появилась другая ошибка

Fatal error: Cannot use intec\core\base\Object as Object because ‘Object’ is a special class name in /var/www/www-root/data/www/red34025.rdock.ru/bitrix/modules/intec.constructorlite/classes/models/Build.php on line 6

/modules/intec.constructorlite/ — так это вам уже к авторам модуля.

 

Пользователь 4319440

Заглянувший

Сообщений: 14
Регистрация: 05.06.2020

#25

12.06.2020 12:18:42

Короче дело было в PHP, пришлось вернуть старую версию.

Понравилась статья? Поделить с друзьями:
  • Mysql ошибка 126
  • Mtco system ивеко стралис ошибка
  • Mysql обработчик ошибок
  • Mysql ошибка 1226
  • Mysql ошибка 121