Нужна ли мне кодировка utf8mb4 для хранения геокодирования address.components long_names?

Я разрабатываю приложение, в котором люди со всего мира вводят адрес, город или что-то еще в поле поиска. Затем они могут выбрать результаты, соответствующие их цели. Выбранный результат содержит текст из address.components long_name.

некоторые примеры, возвращаемые API геокодера:

"long_name" : "King's Street",
"short_name" : "King's St",
"types" : [ "route" ]

"long_name" : "Newport",
"short_name" : "Newport",
"types" : [ "postal_town" ]

"long_name" : "Staffordshire",
"short_name" : "Staffordshire",
"types" : [ "administrative_area_level_2", "political" ]

В этом случае я бы, например. хранить:

Королевская улица

Ньюпорт

Стаффордшир

в мою базу данных.

Затем... это приложение может хранить данные из местоположений из всех стран и, возможно, на всех официальных родных языках, используемых в этих странах, - с помощью Google в строках long_name. Обратите внимание, что я установил и страну, и язык в геокодере, чтобы показать карту на родном языке пользователя, а также получить результат (строки address.components) на правильном для пользователя языке.

Кто-нибудь знает, можно ли хранить long_names address.components точно (с набором символов) при использовании UTF-8 в MySql (это 3-байтовый UNICODE) или если мне нужно использовать кодировку utf8mb4 (4-байтовый UNICODE) ?

Если мне нужно использовать кодировку utf8mb4, в чем причина этого? Для каких языков, хранящихся в Google Geocoder, требуется utf8mb4 (4-байтовый) UNICODE, чтобы не потерять информацию о символах/языках при сохранении в базе данных?


person bongobongo    schedule 30.06.2016    source источник
comment
Все, что говорит, что это UTF-8, является стандартным 4-байтовым UTF-8. MySQL является исключением, поскольку изначально они использовали 3 байта. Настоятельно рекомендуется использовать utf8mb4 как можно чаще по сравнению с 3-байтовой версией. Этот пост StackOverflow также должен быть вам очень полезен.   -  person Martin    schedule 30.06.2016
comment
Я проверил сообщение, на которое вы ссылаетесь. Этот человек хочет всячески поддерживать UNICODE. Мой подход несколько иной. Мне нужно поддерживать то, что я должен поддерживать. Если геокодер google не возвращает никаких наборов символов (ссылка на то, что геокодер использует в address.components long_name), для которых требуется 4-байтная кодировка UTF-8, то я не вижу причин использовать кодировку utf8mb4, поскольку единственное, что это приведет, это: а) гораздо больше данных в базе данных б) большие индексы, которые снова приводят к более медленным запросам и большему количеству ресурсов, используемых на сервере. Есть ли какая-либо документация, показывающая, какие наборы символов использует геокодер?   -  person bongobongo    schedule 01.07.2016
comment
Если бы я выбирал этот вариант, я бы всегда выбирал utf8mb4, потому что использование любой другой кодировки UTF8_ MySQL просто означает ожидание того, что та же проблема вернется и укусит вас в другой день. Я понятия не имею, что использует геокодер, но UTF8 теперь является стандартным набором символов для веб-сайтов. И размер наборов данных (если только они не очень большие) не повлияет на индексы или скорость поиска данных. MySQL хорош до и превышает миллиарды строк данных.   -  person Martin    schedule 01.07.2016
comment
Кроме того, если какие-либо ваши данные, возвращаемые геокодером, зависят от локали, например названия мест в отдаленных частях мира, тогда эти символы будут потеряны и искажены в 3-байтовом хранилище UTF8. Серьезно, избавьте себя от лишнего веса в будущем и остановите проблему, прежде чем она станет проблемой сейчас. :-) . Используйте 1_   -  person Martin    schedule 01.07.2016


Ответы (2)


Комментарии подразумевают, что реальный вопрос касается размера 3-байтового utf8 и 4-байтового utf8mb4. (Я предполагаю, что вы используете VARCHAR или TEXT?

  • Для английского языка разницы нет — каждый символ занимает 1 байт либо в utf8, либо в utf8mb4. Ни размер, ни кодировка не отличаются.
  • Для Европы разницы нет — каждый символ занимает 1 или 2 байта.
  • Для большинства азиатских языков разницы нет — каждый символ занимает ровно 3 байта.
  • Для китайского языка существует проблема: некоторым китайским иероглифам требуется 4 байта, хранение таких данных в столбце utf8 приведет к усечению или другому искажению.

Итак, вы можете использовать utf8mb4 для всего.

Для каждого приложения, кроме MySQL, "UTF-8" относится к кодировке переменной длины; он может быть даже длиннее 4 байт (хотя ни одному символу еще не были присвоены коды длиннее 4 байт).

person Rick James    schedule 01.07.2016

Если ваше приложение является новым заданием (новым приложением) и вы используете последнюю версию MySQL или MariaDb, вам следует использовать utf8mb4. Он будет обрабатывать все в Unicode, включая некоторые непонятные наборы символов, и вам не придется задумываться над этим вопросом.

person Community    schedule 30.06.2016
comment
Оцените быстрый ответ. Но чтобы еще больше сузить мой вопрос: используются ли какие-либо из используемых строк address.components long_name, возвращаемых геокодером, использовать символы, для которых требуется более 3 байтов UTF8? Если это так, какие языки, в частности (возвращенные геокодером Google), заставляют меня использовать 4-байтовый UTF8? Причина, по которой я спрашиваю, довольно проста. В базу данных поступает много данных, и я хочу использовать как можно меньше места в БД. И если я смогу обойтись 3-байтовой UTF8, то мои индексы также будут меньше, и, вероятно, все будет быстрее с точки зрения запросов. - person bongobongo; 30.06.2016
comment
Только сотрудники Google Maps знают ответ на ваш точный вопрос. Если вы собираетесь собрать достаточно информации, чтобы что-то изменить, вы, вероятно, уже заплатили за коммерческий доступ. Поэтому попросите вашего менеджера аккаунта Google выяснить это для вас. Если вы не заплатили за доступ, они ограничат ваш парсинг, и цены на дисковые накопители упадут до того, как вы заметите хоть малейшее влияние этого. - person O. Jones; 01.07.2016