Почему MySQL использует latin1_swedish_ci по умолчанию?

Кто-нибудь знает, почему latin1_swedish используется по умолчанию для MySQL. Мне кажется, что UTF-8 будет более совместим, верно?

Значения по умолчанию обычно выбираются потому, что они являются лучшим универсальным выбором, но в данном случае, похоже, они этого не сделали.


person Metropolis    schedule 14.10.2010    source источник
comment
Хороший вопрос! mySQL является (или когда-то была) шведской компанией, так что, вероятно, причина шведской части... Что касается latin1, я не знаю.   -  person Pekka    schedule 14.10.2010
comment
@Pekka +1 Ах..... интересно. Я не знал этого.   -  person Metropolis    schedule 14.10.2010
comment
Возможный дубликат Почему в MySQL используется сопоставление по умолчанию latin1_swedish_ci?   -  person Jeff Puckett    schedule 14.06.2016
comment
@JeffPuckettII За исключением того, что об этом спросили первым. Так что это дубликат.   -  person Metropolis    schedule 22.06.2016
comment
@Metropolis Я рад, что вы упомянули об этом, потому что именно поэтому я нашел этот ответ: meta.stackexchange.com/a/147651 /321521   -  person Jeff Puckett    schedule 22.06.2016
comment
@JeffPuckettII Интересно. Так что, если оба имеют хорошие ответы? Похоже, не всегда будет ясно, какой ответ лучше. В этом случае у них обоих могут быть хорошие ответы разным людям. Было бы неплохо, если бы их можно было как-то объединить.   -  person Metropolis    schedule 22.06.2016
comment
@JeffPuckettII В идеале, если вопрос был задан первым, то сразу же, когда будет задан новый вопрос, он будет помечен как дубликат, прежде чем какие-либо вопросы или ответы будут добавлены к более новому. Который всегда возвращал бы всех к оригиналу.   -  person Metropolis    schedule 22.06.2016
comment
@Metropolis, если вы прочитаете этот ответ еще раз, вы увидите Вы можете отметить и попросить модератора объединиться после закрытия, если они точно такие же.   -  person Jeff Puckett    schedule 22.06.2016
comment
@Metropolis В идеале, да, новый вопрос должен был быть помечен еще до того, как на него был получен ответ, но этого не произошло, поэтому система отлова дубликатов еще недостаточно хороша.   -  person Jeff Puckett    schedule 22.06.2016


Ответы (5)


Насколько я вижу, latin1 был набором символов по умолчанию в предмультибайтовые времена, и похоже, что это было продолжено, вероятно, по причинам обратной совместимости (например, для более старых операторов CREATE, которые не указывали сопоставление).

Из здесь:

Что сделал 4.0

MySQL 4.0 (и более ранние версии) поддерживали только то, что составляло комбинированное понятие набора символов и сортировки с однобайтовыми кодировками символов, которые были указаны на уровне сервера. По умолчанию было latin1, что соответствует набору символов latin1 и сопоставлению latin1_swedish_ci в MySQL 4.1.

Что касается того, почему шведский, я могу только догадываться, что это потому, что MySQL AB является/был шведским. Я не вижу никакой другой причины для выбора этой сортировки, она имеет некоторые особенности сортировки (я думаю, ÄÖÜ идет после Z), но они и близко не соответствуют международному стандарту.

person Pekka    schedule 14.10.2010
comment
я думаю, что они могут выбрать это довольно странное словосочетание, чтобы сделать очевидным для пользователя, что его следует изменить. что, конечно, в большинстве случаев не получалось, как ожидалось, но этому мешала тирания по умолчанию :) - person The Surrican; 19.04.2013
comment
@TheSurrican, какой странный ответ. Что делает это странным сопоставлением? Это шведская версия стандарта latin1, выбранная шведской компанией. Это похоже на то, как Oracle выбирает американский английский язык для своих продуктов. - person chrismacp; 20.02.2016
comment
Как насчет того, что latin1_swedish_ci является ISO 8859-1, а ISO 8859-1 является первым из доступных вариантов при сортировке, поэтому, если вы не укажете какой-либо вариант, ‹select› в phpMyAdmin просто выберет первый элемент - person zeachco; 26.09.2016

latin1 — это набор символов по умолчанию. В MySQL latin1 совпадает с набором символов Windows cp1252. Это означает, что он такой же, как официальный ISO 8859-1 или IANA (Internet Assigned Numbers Authority) latin1, за исключением того, что IANA latin1 рассматривает кодовые точки между 0x80 и 0x9f как «неопределенные», тогда как cp1252 и, следовательно, MySQL latin1 присваивают символы для тех должностей.

от

http://dev.mysql.com/doc/refman/5.0/en/charset-we-sets.html

Может помочь вам понять, почему.

person bear    schedule 14.10.2010
comment
Да, но вопрос в том, почему это набор символов по умолчанию, а не невероятно более универсальный UTF-8? - person Pekka; 14.10.2010
comment
Я знаю, какой у него был вопрос. Я могу только предположить, что были ограничения, или он не использовался широко, или был несколько не так популярен в то время. - person bear; 14.10.2010
comment
@Pekka웃 Это потому, что как бы ни был прекрасен UTF-8, он по-прежнему многобайтовый и, что еще хуже, многобайтовый с переменной длиной. И это похоронный звон для чрезвычайно упрощенных программ. Я не думаю, что кто-то когда-либо просыпался в холодном поту, беспокоясь о 5- и 7-байтовых latin1 символах. Конечно, это может относиться только к прошлому. было не есть... - person ebyrob; 31.07.2017
comment
@ebyrob верно, но, возможно, те дни так далеко в прошлом, что они должны быть особым случаем, а не UTF-8, который в наши дни является бытовой кодировкой для новых проектов. - person Pekka; 31.07.2017
comment
@Pekka웃 К сожалению, я отчасти понимаю отсутствие у Oracle какого-либо прогресса в MySQL в глобальном масштабе. Однако я немного ошеломлен тем, что MariaDB не переключилась, хотя они и указывают на это в своей документации: mariadb.com/kb/en/mariadb/setting-character-sets-and-collations/< /а> - person ebyrob; 31.07.2017

Использование однобайтовой кодировки имеет некоторые преимущества перед многобайтовой кодировкой, например. длина строки в байтах равна длине этой строки в символах. Поэтому, если вы используете такие функции, как SUBSTRING, интуитивно непонятно, имеете ли вы в виду символы или байты. Также по тем же причинам требуется довольно большое изменение внутреннего кода для поддержки многобайтовых кодировок.

person AndreKR    schedule 14.10.2010

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

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

person CodesInChaos    schedule 14.10.2010

Чтобы уточнить, почему не utf8, и объяснить ошибку, не упомянутую в другом месте в этой теме, имейте в виду, что есть ошибка с mysql utf8. Это не utf8! Mysql существует уже давно, еще до появления utf8. Как объяснялось выше, вероятно, именно поэтому он не используется по умолчанию (обратная сопоставимость и ожидания от стороннего программного обеспечения).

В то время, когда utf8 был новым и редко использовался, похоже, разработчики mysql добавили базовую поддержку utf8, неправильно используя 3 байта памяти. Теперь, когда он существует, они решили не увеличивать его до 4 байтов и не удалять. Вместо этого они добавили utf8mb4 multi byte 4, что является реальным 4 байтом utf8.

Важно, чтобы любой, кто переносит базу данных mysql на utf8 или создает новую, знал, что нужно использовать utf8mb4. Для получения дополнительной информации см. https://adamhooper.medium.com/in-mysql-never-use-utf8-use-utf8mb4-11761243e434

person antus    schedule 18.07.2021