Эмодзи только в карточке товара, как сделать?

Для добавления поддержки эмодзи не хочу запускать общую кнопку в настройках webasyst (ведь она сменит кодировку во многих не нужных мне таблицах), так как хочу сменить кодировку только у одной таблицы shop_product, а именно description, в ней хочу поменять utf8_general_ci на utf8mb4

Перед запуском в настройках базы данных вебасиста написано:
Для смены кодировки таблиц и полей в базе данных можно также использовать phpMyAdmin.

Вопрос: где в phpMyAdmin можно сменить кодировку у одной таблице с utf8_general_ci на utf8mb4? Ребят, подскажите пожалуйста - может есть какой sql запрос?

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

7 ответов

  • 2

    Перейти в нужную таблицу, вверху выбрать раздел Операции и поменять сравнение


  • 2
    Владимир 18 октября 2019 19:43 #

    При sql запросе тоже ошибка

    О каком ключе идёт речь?!

    • +2
      replicant replicant 18 октября 2019 21:56 #

      Постараюсь объяснить максимально просто.

      У вас появляется эта ошибка потому что у вас старый MySQL с ограничением ключа для таблиц типа MyISAM в 1000 байт. В версиях старше 5.6 и вроде даже в последних 5.6.х каких-то длина увеличена до 3072 байт. Поле name является индексом (серый ключик) в этой таблице.

      При переходе от utf8 (3 байта на символ) к utf8mb4 (4 байта) расчет на длину поля типа VARCHAR примерно следующий (там ещё несколько байт надо отнимать):
      1000/3 = 333
      1000/4 = 250, т.е. в вашем случае либо VARCHAR надо меньше 250 символов (скажем 240), либо версию MySQL менять на ту, где лимит 3072. Потому что 255*4=1020, а это больше 1000.

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

      На скриншоте я показал свою попытку увеличить до 1000 длину VARCHAR. 1000*4 > 3072. Тоже есс-но ожидаемо поймал ошибку.

      Если я уберу с поля name индекс, то мне станет доступна длина превышающая лимит, но поскольку индекс как бы важен, то лучше не убирать. Хотя, если у вас поиск не умный на сайте, а простой, то можно и дропнуть индекс по столбцу name. Тогда длина поля типа VARCHAR вас не побеспокоит и можете её оставить 255. См. скриншот ниже с примером 1200*4 > max3072




      Иными словами вариантов как поступить у вас минимум три. Выбирать вам.
  • 1
    Владимир 18 октября 2019 16:44 #

    Поменял кодировку только у одной таблицы shop_product, а именно у description, да, смайлы в товаре теперь отображаются и товар сохраняется, но при сохранении товара пишет:

    1267. Query Error 1267: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'like' Query: SELECT id FROM shop_search_word WHERE name LIKE '?'

    Подскажите пожалуйста, в какой таблице ещё нужно сменить кодировку на utf8mb4_general_ci, что-бы товар со смайлами сохранялся без ошибки?

    ---

    Кстати. без смайлов товар сохраняется без ошибки.

    • +1
      replicant replicant 18 октября 2019 16:58 #

      Судя по тексту ошибки это shop_search_word.

      • +1
        Владимир Владимир 18 октября 2019 17:07 #

        shop_search_word уже пробовал менять, не меняется там кодировка в name, не вручную, не  с общей кнопки запуска с бекенда (проверял на тесте эту кнопку - пока не вижу смысла её нажимать на основе и кодировать почти все таблицы).

        просто в shop_search_word - меняется, но ошибка та же. 

        • +1
          replicant replicant 18 октября 2019 18:02 #

          Смоделировал на тестовой установке вашу задачу. Меняется всё и через инструменты интерфейса phpmyadmin или запросом вида там же

          ALTER TABLE `shop_search_word` CHANGE `name` `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;

          После этого ошибка исчезает.

          Чтобы изменить отдельно взятое поле, надо зайти в Структуру конкретной таблицы и изменять отдельное поле, а не всю таблицу через меню Операции, которые над таблицой целиком делаются. Стрелочками на скрине показано куда нажимать, чтобы изменить поле.

          Ниже итог ручной конвертации двух полей двух разных таблиц, показанный в админке WA.

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

  • 1
    Владимир 18 октября 2019 19:19 #

    Именно всё так и делал. 

    shop_search_word - структура - в поле name менял на нужную кодировку - выдаёт ошибку при сохранении нужной кодировки, если бы всё сохранилось, то так бы естественно и вопросов не возникало даже.
  • 1
    Владимир 18 октября 2019 22:45 #

    Гениально!!! Спасибо большое, так как у меня умный поиск, а обновлять версию MySQL я не раз ещё не пробовал, даже не знаю, где свою версию MySQL узнать и как её обновить - я просто урезал VARCHAR с 255 до 240 и всё получилось, сохраняется теперь без ошибок.

    • +1
      replicant replicant 19 октября 2019 11:23 #

      Если вы арендуете хостинг, то это достаточно просто делается в панели управления вашей площадкой для размещения проектов (сайтов). У разных компаний инструменты выглядят по-разному, но смысл примерно одинаковый. Выбираете подходящую вам версию из предлагаемых (обычно их несколько). Хостер делает замену ПО по сути в автоматическом режиме. Несколько минут ваш проект в процессе смены версии может быть недоступен. Возможно надо будет проделать ещё какие-то действия. В любом случае у хостера уточните детали и тонкости, а сам процесс достаточно простой. На одном из хостингов предлагается на выбор вот такой список комбинаций ПО. Для последних версий WA+SS и даже для некоторых плагинов рекомендуется выбирать из версий ПО более новое.

  • 1
    Владимир 19 октября 2019 13:59 #

    Спасибо. В настройках вебасиста смотрел, написано что у меня версия MySQL 5.7

    Хостер сказал что не в версии MySQL дело, а в типе таблиц, у меня везде стоит MyISAM

    shop_search_word поменял с MyISAM на InnoDB и VARCHAR на 255 обратно поставил и всё тоже сохраняет без ошибок.

    Вот у меня такой вопрос возник, вот этот тип таблицы MyISAM фреймворк сам ставит при установке? 


    Я вообще думаю все таблицы поменять с MyISAM на InnoDB но может это плохо обернётся в дальнейшем, не знаю (мне кажется что InnoDB лучше чем MyISAM - а может я и не прав, может наоборот MyISAM лучше). Может при обновлении вебасиста снова будут изменяться типы таблиц на MyISAM ?

    • +2
      replicant replicant 19 октября 2019 15:02 #

      У меня все таблицы MyISAM, но лимит 3072. Впрочем хостеру видней что у них там в конкретном случае сконфигурировано и как скомпилировано. По крайней мере теперь вам примерно понятен процесс.

      Вот тут про InnoDB написано (Гуглопереводчик в помощь) https://dev.mysql.com/doc/refm... и еще вот тут про MyISAM https://dev.mysql.com/doc/refm...

      А MyISAM vs. InnoDB - это вообще отдельная большая тема. Для начала лучше почитать материалы на эту тему перед тем как конвертировать.

      Типы таблиц при обновлении не меняются. Они задаются при создании таблиц базы в самом начале. Или меняются руками при необходимости потом.

  • 1
    Владимир 19 октября 2019 15:08 #

    Спасибо за помощь! Теперь более менее понятно что к чему.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите