2013-12-04 2 views
1

У меня есть моя база данных с utf8mb4 во всех таблицах и все столбцы char/varchar/text. Все работает нормально, но мне было интересно, действительно ли это нужно для всех столбцов. Я имею в виду, что у меня есть столбцы, которые будут содержать текст пользователя, который требует utf8mb4, поскольку пользователь может вводить любой язык, вставлять смайлики и т. Д. Однако у меня есть разные столбцы, которые будут содержать другие типы строк, такие как токены доступа пользователей, коды стран, псевдонимы пользователей, которые не содержат странных символов, и так далее.MySQL: разные кодировки для различного содержания текста, стоит ли это?

Стоит ли менять кодировку этих столбцов на что-то вроде ascii или latin1? Это улучшит пространство базы данных, эффективность? Я чувствую, что набор charset, такой как utf84mb для чего-то, что никогда не будет содержать символы юникода, является пустой тратой «чего-то» ... но я действительно не знаю, как это управляется внутри MySQL.

С другой стороны, я подключаюсь к этой базе данных с php и устанавливаю кодировку соединений на uft8mb4, поэтому я полагаю, что все столбцы non utf8 будут преобразованы автоматически. Я полагаю, это не проблема, так как utf8 является надмножеством ascii или latin1.

Любые советы? профи и контрас? Благодаря!

+1

Utf8 очень мал, когда кодировка является латинским-1, вы теряете возможность мультибайта получать очень мало. – Anthony

+0

Плюсы очень мало, это только даст вам больше головной боли до кодирования позже, так что не делайте этого –

+1

UTF-8 является надмножеством ASCII, поэтому любой текст в диапазоне x00-x7F является одиночным байтом. Он занимает такое же пространство в ASCII, Latin-1 или UTF-8.Не стоит менять определенные поля (столбцы) с UTF-8 на ASCII или Latin-1, особенно если это уже используется в производстве. Что касается времени обработки, вы можете потратить немного больше на поля UTF-8 (нужно проверить многобайтовые символы), но это не должно быть серьезным хитом. –

ответ

1

Короткий ответ заключается в том, чтобы сделать все ваши столбцы и таблицы по умолчанию одинаковыми, UTF-8.

Долгосрочный ответ объясняется тем, как кодируется UTF-8, где ASCII будет отображать 1: 1 с UTF-8 и не несет никаких дополнительных издержек на хранение, например, с UTF-16 или UTF-32. не ахти какое дело. Если вы сохраняете не-ASCII-символы, это займет больше места, но если вы их сохраните, вам все равно понадобится поддержка.

Смешанные наборы символов в ваших таблицах просто требуют неприятностей. Единственным исключением является определение столбцов типа BINARY или BLOB, которые не являются UTF-8, а вместо них двоичными.

Даже the documentation проясняет единственное место, это проблема с CHAR столбцов, а не VARCHAR, но это не очень хорошая идея использовать CHAR колонки в первую очередь.

0

ASCII - это строгое подмножество UTF-8, поэтому в эффективности пространства есть ровно нулевой коэффициент полезного действия, если у вас нет ничего, в котором используются специальные символы, хранящиеся в UTF-8. Существует незначительное улучшение эффективности использования пространства, если вы используете латинский-1 вместо UTF-8 для хранения текста, полученного из латина (специальные символы, которые UTF-8 использует 2 байта, могут быть сохранены только одним байтом в латинском-1), но вы получаете много головных болей на пути, и вы теряете совместимость с более широкими наборами символов.

Например, ñ хранится в виде 0xC3 0xB1 в UTF-8, тогда как Latin-1 сохраняет его как 0xF1. С другой стороны, a - 0x61 в обоих кодировках. Умные парни, которые изобрели UTF8, сделали это так. Вы сохраняете один байт, только для специальных символов.

TL; DR Используйте UTF-8 для всего. Если вам нужно спросить, вам больше ничего не нужно.

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