Как записать Unicode-символы в mysql

Сайт на 2-е

#1 5 февраля 2016 в 16:51
Собственно проблема такая: если в тексте есть подобный символ 📌 то текст после него не записывается в бд.(как и сам этот символ) Меня устроит любой из двух вариантов решения:
1. каким-то образом удалить из строки все подобные символы
2. записать как-то текст вместе с ними
Что уже пробивал:
— Перед записью пропустить строку через: strip_tags, htmlspecialchars и подобные.
— Чистить текст регуляркой preg_replace ("/[^А-Яа-я0-9\i]/","",$resp); После такого получал новые символы со знаком вопроса..
Единственное что пока сработало это такой подход^
$vowels = array("🎁", "♦", "📌", "▼", "🐾", "✔", "🏆", "📢", "⌚", "⭐", "😃", "🎧", "🎤", "📷", "🔥", "🏻", "➰", "💡", "▶", "❤", "🍀", "🌎", "💰", "🤘", "🔋", "🎶", "😳", "⬇");
$resp = str_replace($vowels, "", $resp);
Но в виду того что предоставленный массив выше не содержит и одной сотой доли, от всех возможных символов, подобный подход считаю не рациональным.
Есть идеи как тут быть?
Уточняю, что сижу на двойке и записываю в базу через модель ф-й update.
#2 5 февраля 2016 в 18:39
SpAyN,
Мне вот что интересно: в этой теме Вы смогли выложить на форум все эти символы, а содержимое постов записывается именно в базу.
Почему база этого сайта принимает юникодовые символы, а база вашего — нет?

Проверка

"🎁", "♦", "📌", "▼", "🐾", "✔", "🏆", "📢", "⌚", "⭐", "😃", "🎧", "🎤", "📷", "🔥", "🏻", "➰", "💡", "▶", "❤", "🍀", "🌎", "💰", "🤘", "🔋", "🎶", "😳", "⬇"

Мистика! Ни один из моих сайтов эти крякозябры не ест, а тут — пожалуйста!
Вот как выглядят эти крючки при редактировании:

#3 5 февраля 2016 в 19:24


SpAyN,
Мне вот что интересно: в этой теме Вы смогли выложить на форум все эти символы, а содержимое постов записывается именно в базу.
Почему база этого сайта принимает юникодовые символы, а база вашего — нет?

Проверка

"🎁", "♦", "📌", "▼", "🐾", "✔", "🏆", "📢", "⌚", "⭐", "😃", "🎧", "🎤", "📷", "🔥", "🏻", "➰", "💡", "▶", "❤", "🍀", "🌎", "💰", "🤘", "🔋", "🎶", "😳", "⬇"

Мистика! Ни один из моих сайтов эти крякозябры не ест, а тут — пожалуйста!
Вот как выглядят эти крючки при редактировании:


HiAndy

Мой сайт их пропускает если вставлять их в текстовое поле, но не один из 3-х редакторов их не пропускает и вставка в базу с помощью функции тоже.
#5 5 февраля 2016 в 20:43
HiAndy, ассоциировав поле с cp1251_general_ci, теперь оно сохраняет, но на место спец символов ставит "????" потом функцией str_replace('????', "", $resp); удаляю эти вопросы, пока проблему решил так. При попытке же использования ф-и iconv записывает в базу только 0 и поюзав ф-ю utf8_html_entity_encode так и не заметил разницы, вникать же в нее не стал…
В целом спасибо за помощь!
#6 5 февраля 2016 в 21:05
SpAyN,
Так может просто отсекать все эти \xc2\xc3\xc5\xc6\xcb\xce\xcf?
#7 5 февраля 2016 в 21:17
HiAndy
Я так понимаю ф-я utf8_html_entity_encode должна это делать, но она у меня не работает, просто я не вижу не каких изменений после пропуска строки, через нее.
#8 6 февраля 2016 в 00:22
SpAyN, если интересует решение с помощью хака:
1. в файле ..\system\core\database.php добавляем в функцию query($sql, $params=false, $quiet=false) 146 строка следующее:
  1. $this->mysqli->set_charset('utf8mb4');
2. в нужном вам типе контента (или во всех типах контента)) ) в таблице cms_con_<имя_типа_контента> (cms — ваш префикс таблиц БД)
меняем тип поля content с utf8_general_ci на utf8mb4_general_ci.
Всё! Теперь в БД будут записываться все символы)
Стоит учесть что поле seo_desc также формируется из добавляемого/редактируемого контента, но мы не поменяли его тип сравнения, следовательно не все символы попадут в него в неизменном виде.

Что мы сделали:
Мускул имеет 2 типа utf8 — собственно utf8 (1-3 байта) и utf8mb4 (4 байта). В первый тип записываются не все символы передаваемых строк (попросту говоря режутся "тяжелые" четырехбайтные). Так вот, первым действием мы указали набор символов по умолчанию, а во втором — поменяли тип поля, чтобы эти символы могли сохраниться в неизменном виде.
#9 6 февраля 2016 в 12:41
Val
Спасибо, все работает!
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.