mysql varbinary vs varchar - PullRequest
       43

mysql varbinary vs varchar

4 голосов
/ 10 июня 2009

Мы используем varchar (255) для хранения «ключевых слов» в mysql. Мы сталкиваемся с проблемой, что mysql игнорирует все конечные пробелы для сравнения в "=". Он учитывает конечные пробелы в сравнении «как», но не позволяет хранить одно и то же слово с конечными пробелами в столбце varchar и без него, если над ним есть индекс «UNIQUE».

Итак, мы рассматриваем возможность перехода на varbinary. Кто-нибудь может подсказать, какие могут быть последствия, когда в значениях столбцов есть многобайтовые символы?

Ответы [ 3 ]

2 голосов
/ 17 июня 2009

Andomar,

Мы используем версию 5.0.5. Все версии mysql игнорируют конечные пробелы для сравнения. Из руководства:

Все сортировки MySQL имеют тип PADSPACE. Это означает, что все CHAR и Значения VARCHAR в MySQL сравниваются без учета каких-либо конечных пробелов. Это верно для всех версий MySQL, и не имеет значения, ваша версия урезает конечные пробелы от значений VARCHAR перед сохранением их

Кроме того, mysql считает, что тексты с / без конечных пробелов дублируются в индексах:

Для тех случаев, когда трейлинг колодки символы раздеты или сравнения игнорировать их, если столбец имеет индекс что требует уникальных значений, вставка в значениях столбцов, которые отличаются только по количеству висячих площадок символы приведут к ошибка двойного ключа. Например, если таблица содержит «а», попытка store 'a' вызывает дубликат ключа ошибка.

И нам абсолютно необходим индекс по ключевым словам. Итак, я думаю, у нас есть два варианта: varbinary или text. Мы оценим производительность «текста» и многобайтовую функциональность для varbinary.

0 голосов
/ 11 мая 2011

В дополнение к проблеме конечного пространства, ваш UNIQUE INDEX в MySQL будет ограничен 767 байтами (что составляет 767/3 ~ = 255 для 3-байтового UTF8). Смотри также:

0 голосов
/ 10 июня 2009

Это то, что руководство MySQL говорит о конечных пробелах:

Обработка конечных пробелов версия-зависимая. Начиная с MySQL 5.0.3, концевые пробелы сохраняются, когда значения хранятся и извлекаются, в соответствие стандарту SQL. До MySQL 5.0.3, завершающие пробелы удалены из значений, когда они хранится в столбце VARCHAR; этот означает, что пробелы также отсутствуют из полученных значений.

Поскольку ваш вопрос говорит о том, что MySQL не пересекает конечные пробелы, я предполагаю, что ваша версия ниже 5.0.3. Подумайте об использовании типа TEXT для вашего столбца; они сохраняют висячие места. TEXT будет обрабатывать кодирование и декодирование строки , поэтому вам не нужно беспокоиться о многобайтовых символах.

ТЕКСТ работает медленнее, чем VARBINARY. Если фактические данные показывают, что производительность неприемлема, вам, возможно, придется выбрать VARBINARY (или BLOB-объект). В этом случае вам нужно сохранить строку в определенной кодировке, например UTF-8 . Пока все ваши клиенты используют одинаковую кодировку, это будет хорошо работать для многобайтовых символов. Протестируйте своих клиентов с разными региональными настройками:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...