Благодаря широкому использованию различных мульти-байтовых наборов символов, очень высокая доля англоязычных программистов в разработке программного обеспечения мало знает о мульти-байтовых символах. Автор этой статьи рассказывает о его собственных взглядах на роль архитектуры набора персонажей MySQL. В последние несколько месяцев каждый раз, когда я использую MySQL, я почти всегда думаю: действительно ли текущая иерархическая архитектура набора символов MySQL?
MySQL набор символов обработка
Отправить запрос
Client (farmate_set_client) =》 Соединение базы данных (farmate_set_connection) =》 Storage (таблица, столбец)
запрос на возврат
Storage (таблица, столбец) =》 Соединение базы данных (farmate_set_connection) =》 client (farmate_set_results)
В каждом ненитивном узле операция преобразования набора символов выполняется из предыдущего узла в текущий узел. Например, рассмотрим следующую среду:
◆ Характер_SET_CONNECTION UTF-8
◆ Характер_SET_RESULT GBK
◆ Parmate_set_client GB2312
◆ Существует таблица A, а наборы символов поля все BIG5
При отправке запроса данные сначала преобразуются из GBK в UTF-8, затем в BIG5, а затем хранятся.
При возврате запроса данные сначала преобразуются из BIG5 в UTF-8, затем в GB2312, а затем отправляются клиенту.
Роль архитектуры
1. Позвольте разным клиентам иметь разные наборы символов. Типичным примером является то, что у меня есть сайт UTF-8, который является клиентом с клиентом Charset UTF-8. В то же время мне может потребоваться прочитать и написать базу данных на терминале GBK, который является другим клиентом, но его набор символов - GBK.
2. При использовании файловой системы через базу данных вам необходимо преобразовать путь файла в набор символов файловой системы. Например, мой клиент-GBK, а файловая система сервера-UTF-8. Операция "/A Slice/rina.rmvb" Среди отправленных данных данные «среза» отличаются от сервера. В настоящее время должен быть способ преобразовать «ломтик» GBK в UTF-8. Здесь MySQL представляет что -то, что называется характерно, чтобы выполнить это.
Кроме этого, я не могу думать ни о каком другом применении на данный момент. Но подумайте об этом внимательно, действительно ли нам нужно такое лечение? Многие сайты просто надеются, что их данные могут выйти, как им угодно. Здесь есть еще две ситуации.
1. Я надеюсь, что смогу сортировать или выполнять как операции на основе данных. Давайте сначала поговорим о сортировке. При сортировке упрощенного китайца вы обычно хотите сортировать Pinyin. Я не понял проверку в MySQL, но, судя по программам, с которыми я вступил в контакт, если этот тип сортировки требуется, поле специально создано для хранения Pinyin для сортировки. Есть также полифонические символы в пинеине. Если это UTF-8, существует также ситуация, когда Китай, Япония и Южная Корея разделяют определенный диапазон китайцев. Его не так просто реализовать, поэтому ни GBK, ни контроль UTF-8 MySQL не должны реализовать Pinyin. Я осмелюсь сказать, что большинство веб -сайтов в Китае, которые используют MySQL, теперь используют набор чеков, который является всего лишь сортом байта. При сортировке байта вообще не нужно использовать какого -либо набора символов. Поэтому для китайских сайтов проверка персонажа MySQL не имеет смысла в сортировке.
Но с точки зрения подобной операции, это имеет небольшое значение. Например, если мне нравится «%a%», можно соответствовать китайскому символу, содержащему А в определенной части. Конечно, эта ситуация не будет столкнулась в соответствии с UTF-8, потому что формат хранения UTF-8 означает, что A может быть только A, и не может быть частью мульти-байтового символа. Но эта проблема может возникнуть в других наборах символов. В конце концов, подобно тому же, что и порядок, делая проверку бессмысленной. слабый.
2. Если нет необходимости сортировать данные, например, или полный текстовой поиск, пожалуйста, прекратите использование char, varchar, текст и тому подобное. Двоичный, варбина, капля - правильный выбор. Бинарный и т.п. не будет выполнять преобразование набора символов при хранении и получении, но при сортировке они отсортируются только в соответствии с бинарным содержанием, поэтому эффективность намного выше, чем у Char, Varchar и Text.
В этом случае нет необходимости в наборе символов. Однако, согласно текущей архитектуре MySQL, операции набора символов между клиентом и подключением игнорируют типы поля.
Также упомяните настройку набора символов в PHP. Пожалуйста, прекратите использование операторов, таких как mysql_query («Установить имена UTF8»). MySQL_SET_CHARSET () - самый полный метод набора символов. Последний имеет на одну более настройку, чем первое, чтобы установить член charset struct mysql. Эта переменная участника играет очень важную роль в побеге, особенно для кодирования форматов, таких как GBK, которые используют «» как часть персонажа. Если вы используете только mysql_query («Установить имена XXX»), то в некоторых наборах символов будут основные отверстия для безопасности, что приведет к тому, что MySQL_Real_escape_String станет таким же небезопасным, как AddSlashes.
-