Мы используем MySQL в компании, где я работаю, и мы строим оба клиентских и внутренних приложений с использованием Ruby на Rails.
Когда я начал работать здесь, я столкнулся с проблемой, что мне раньше не приходилось встречаться; базы данных на рабочем сервере установлен на латыни-1, Что означает, что MySQL камень бросает исключение, когда нет пользовательского ввода, в котором пользователь копирует & вставляет символы UTF-8.
Мой босс называет эти-то "плохих" и поскольку большинство из них непечатные символы, и говорит, что мы должны лишить их. Я'вэ нашел несколько способов сделать это, но в конце концов, мы'вэ оказались в ситуации, когда в UTF-8 символ был нужен. Плюс он'ы немного хлопот, тем более что это, кажется, единственное решение, которое я когда-либо читал про эту проблему, просто выберите базу данных в UTF-8 (для меня).
Единственный аргумент, что я'вэ слышал для наклеивания с Latin-1, что позволяет непечатные символы UTF-8, может испортить текст/полнотекстовый поиск в MySQL. Неужели это правда?
Есть и другие причины следует использовать латинские-1 за кодировки UTF-8? Это's в моем понимании, что это отличный и становится все более популярным.
Юникод-это конечно сложно, и кодировка UTF-8 имеет несколько неудобных свойств. Однако, в UTF-8 стало де-факто стандартом кодирования в интернете, превзойдя в ASCII, Latin-1, в, UCS-2 и UTF-16. Просто использовать UTF-8 везде](http://utf8everywhere.org/).
Самая важная причина, почему вы должны поддерживать Юникод, что вы должны'т делать лишних предположений о входных данных пользователя. Я понятия не имею, что ваш домен, но такие вещи, как древнееврейские имена, блог о Китае, комментарии, смайлики, или просто хорошо оформленный текст – как “это” – должно быть можно... О, это были типографским способом правильные кавычки (“”
а не в ""
в), Ан-широкое тире, и многоточие, в котором работают герои, которые являются общими в английском тексте, но не поддерживается в кодировке ASCII или Latin-1. Так что не поддерживая другие скрипты это'Т просто большой F*ck вы к другим культурам, но торчит в Латинской-1 Не'т даже позволяют писать на правильном английском.
Понятие, что только Юникод позволяет “плохие символы” - это неправильно. Да, текст действительно сложный, и выиграл Юникода'т скрыть это от вас. Ваш босс может думать о составе персонажами, где одну базу кода, например, A
изменяется на последующих кодов, что, например, представляют диакритические знаки образуют один визуальный символ, например á
. Это не'т реально получить в вашем пути, когда пытаюсь сделать поиск, если вас какой-то нормализации. Например, вы могли бы хранить весь текст в виде NFC, который рушится таких композиций в составной форме, если таковая имеется. Когда делаешь поиск, вы также можете вырезать все сочинения символы из текста, но это может существенно изменить свое значение в некоторых языках.
Юникод также добавляет много непечатаемых символов – но даже в ASCII имеет множество из них. Будете ли вы обращаться в нуль в середине строки? Как насчет 0x1C, “файл сепаратор”? Я've никогда не видел половина этих. Латинский-1 добавляет мягкий дефис, что означает слово разбить возможностей, но невидимы. Это также сломать вашу полнотекстового поиска? Другими словами, даже ASCII и Latin-1, в позволит вам полностью нарушить ваш вклад, если вы предполагаете, что это's все просто печатный текст!
Я думаю за технический вопрос, ваш босс может не иметь время, чтобы держать в курсе текущих стандартов.
Поскольку его позиция полностью не ушли на обед, просто устарели, уважать его позицию при обсуждении этого вопроса (и вы должны помнить, чтобы обсудить, не спорю), и попробовать работать через проблемы он касается в UTF-8. Я подозреваю, что основной вопрос это не технический вопрос и может потребовать некоторого уровня софт-навык ведения переговоров.
кто из нас прав?
Давным-давно, твой босс. Но время идет, все меняется. В настоящее время, вы (но перед запуском своего босса, обязательно прочтите Нельсон'ы ответ тоже).
Старые версии MySQL, и старые версии почти все, нанесен намного лучше с старых латинских типа 1/ИСО-8859-1(5), чем в utf8.
Есть причина, почему кодировке utf8 была создана, развивалась, и толкнул в основном везде: если правильно реализован, работает он намного лучше. Есть некоторые проблемы с производительностью и хранения связано с тем, что в латинских типа 1 символ-8 бит, в то время как символ utf8 может быть от 8 до 32 бит. Поэтому при планировании типа varchar
вы должны учитывать это. И ваши поисковые процедуры будет немного медленнее. Они будут иметь возможность делать другие вещи (например, поиск с чувствительность акцентом или без. Может'т сделать те, в latin1 без большой работы), но они будут занять немного больше времени.
Но с другой стороны, хранение на складе дешевые, в реалистичные накладные на размеры файлов меньше чем на 2-3%, вычислительные мощности тоже дешевые и дешевеют в хорошем согласии с Мур'ы права; в то же время время и ваши клиенты' ожидания наверняка не'т.
Возможно, вам придется беспокоиться за средства поиска и др. если вы развивать такие инструменты. Но вы, наверное, не'т. Вы использовать инструменты; даже те, которые были не полностью в кодировке utf8. вчера (как раньше MySQLs там'т), сегодня, или скоро будет (например, MySQL с поддержкой utf8mb4).
Поэтому путем тщательного планирования и реализации кодировке utf8 правильный путь (не хлопая его по latin1 как спохватившись) вы можете иметь код, который очень разумно будущее, что, если вы планируете когда-нибудь делать бизнес с любой азиатской стране, это очень хорошая вещь. И если у вас нет таких планов, других людей будет, и эти люди могут быть вашими клиентами, поставщиками или партнерами.
Поэтому, когда они начнут отправлять данные в utf8, вы'придется создать сложную штуковину, чтобы преобразовать в и от latin1, и дело с неразрешимыми дела.
Когда вы фактор в бюджете стоимости нескольких стычек с злой mojibake ниндзя, и считаем, что они не собираются уходить - как вы уже обнаружили, - то вы'МР понять, что происходит utf8 является не только проще, это's будет дешевле*, а также.
В некоторых ситуациях, когда ограничения на набор символов только в ASCII может иметь смысл для общества выбор полей, например поля, потому что вы жестко контролировать значения, которые могут быть там, и внешний ключ/Ссылка на внешние системы, ведь там редко каким-либо причинам для них есть ничего, кроме алфавитно-цифровых знаков и символов.
Для любых других текстов, просто использовать UTF-8.
Чтобы начать с ответа, это вовсе'т имеет значения, как ваш сервера настроен. Кодировка в MySQL может быть настроен для каждого столбца (т. е. за одним столом могли удержать символов в различных кодировках, простой). Т. е. мой сервер (и ряд устаревших баз данных) настроен для работы в кодировке cp1251 по умолчанию для старых клиентов, которые не в состоянии установить правильные параметры сортировки при подключении (различных аппаратных клиентов), но основной базы данных в производстве используют кодировку UTF-8.
Говоря о "и неиспользуемого пространства на" Вы можете'т реально важные данные отходы, можно? Хранения увеличить пространство, однако, будет отличаться в зависимости от языка вашего данных. От незначительного (менее 1%) рост, если ваш сайт в основном на английском языке до 100%, если это mailny используя символы вне диапазона ASCII. И даже больше, если вы двигаться выше Востока. Позже в UTF-8 (так называемый UTF8mb4) технические характеристики позволяют до 4 байт на символ.
И чтобы "Кто'право и quot С&;... правда, это социальный вопрос больше технический. Там могут быть веские причины для конкретного сервера, но вы должны знать последствия. Но если вы спросите меня, там's нет причин, чтобы не использовать UTF-8. Это's одна разновидность править все тексты в мире.
Просто объясните ему, что UTF-8 по умолчанию для веб-трафика. И любой пользователь может ввести любой символ юникода в своем браузере.
Его просто намного удобнее иметь кодировку UTF-8/Unicode все от переднего конца до заднего конца, чем дело с множеством различных проблем, возникающих в связи с UTF-8-> в Латинской-1-> в UTF-8.