2016-10-08 2 views
0

Только сейчас, я столкнулся с проблемой, что я случайно не сталкивался раньше:Обработка смешанных utf8 и utf8mb4 Mysqli & PHP

В целях поддержки Emoji в конкретных колонках, я решил установить мой mysqli_set_charset() в utf8_mb4 и несколько колонок, кодирующих мою базу данных.

Теперь я столкнулся с проблемой PHP на самом деле неправильно обрабатывая символы с акцентом, исходящие из нормальных utf8 закодированных полей.

Теперь я застрял в смешении utf8 и utf8mb4. Поскольку моя обработка данных не очень сильная (используется для работы с фреймворками, которые обрабатывали все это для меня), я совершенно незнакомо с тем, как я мог бы наилучшим образом решить эту проблему.

Я думал о следующих вариантах:

1) установить всю свою базу данных для utf8mb4 сортировки вместо utf8 с некоторыми исключениями.

2) использовать mysqli_set_charset(), чтобы изменить его, и просто убедитесь, что запросы получать указанные данные разделяются

Теперь ни один из них, кажется, как великие идеи для меня, но я не могу думать ни о каком лучшее решение ,

Итак, есть оставшиеся вопросы:

  • Будет ли установка всей моей БД, чтобы utf8mb4 вместо utf8 быть большое изменение производительности? Я действительно понимаю, что utf8mb4 больше и, следовательно, медленнее, поэтому я попытался использовать его только на рассматриваемых столбцах.
  • Есть ли способ для меня просто иметь ручку PHP utf8 кодирование хорошо, даже если mysqli_charset находится на utf8mb4?
  • У вас есть идея?

У меня настоящая потеря на эту тему, и я честно не могу догадаться, какой вариант лучше. Googling на нем не помог слишком много, поскольку он только вернул ссылки, объясняющие различия в нем или о том, как конвертировать вашу базу данных в utf8mb4, поэтому я очень хотел бы услышать мысли об этом одного из мудрых SO-коллег!

Столбцы в данном конкретном случае:

enter image description here

Мой ответ включая определение кодировки символов в PHP:

arri�n = UTF-8 
bolsward = ASCII 
go�nga = UTF-8 
lo�nga = UTF-8 
echt = ASCII 
echteld = ASCII 
echten (drenthe) = ASCII 
echten (friesland) = ASCII 
echtenerbrug = ASCII 
echterbosch = ASCII 

Мой Mysqli кодировок: mysqli_set_charset($this->getConn(), "utf8mb4");

- и я понял, проблема была в моем mysqli_set_charset. там действительно был символ подчеркивания ...

ответ

1

Написано utf8mb4 (без подчеркивания).

См. Trouble with utf8 characters; what I see is not what I stored. В частности, прочтите «Обзор того, что вы должны делать» в ответе.

Вам не нужно менять весь дБ. Достаточно указать utf8mb4 только для выбранных столбцов.

Для связи вам необходимо использовать utf8mb4, но вы указали 'UTF-8', что эквивалентно внешнему миру в MySQL utf8mb4. MySQL utf8 является подмножеством utf8mb4. (Примечание: я точно использую дефисы и символы подчеркивания.)

utf8mb4 не больше и не медленнее для передачи символов, которые являются общими между utf8mb4 и подмножеством utf8. Emoji - 4 байта, поэтому они больше, чем большинство других персонажей, но вы застряли с ними в 4 байта; не потейте.

+0

Я прочитал ваш ответ по другому вопросу, и моя проблема связана с черными бриллиантами. Теперь я сделал почти все, что вы сказали, в первую очередь. Мои метатеги, заголовки php, почти каждая кодировка у меня установлена ​​на 'UTF-8', точно так же, как написано здесь. Я получил кодировку на строку и получил 'UTF-8' для всех строк со специальными символами. ('ASCII' для неспециальных символьных строк). Единственное, о чем я могу думать сейчас, это то, что я ввожу данные непосредственно в базу данных из PHPMyadmin (через запрос, хотя). Может, так оно и есть? Я так потерялся прямо сейчас. – NoobishPro

+0

Yeeeeeep, исправил его, ответив на другой пост, в конце. Довольно поздно, что на 'mysqli_set_charset()', я должен специально использовать 'utf8' или' utf8mb4', а не 'UTF-8'. Кроме того, я использовал имя PHPMyAdmin, которое, очевидно, было очень глупо. (Я получил подчеркнутое правописание оттуда!) Большое вам спасибо! Ты заслуживаешь пива, мой человек! – NoobishPro

+0

Спасибо за похвалу. Я потратил годы, отдавая свой совет на этот вопрос, ответ на который я ответил. Вы говорите, что у меня есть орфографическая ошибка в этом Q & A (или этом)? Если это так, я должен это исправить. –

Смежные вопросы