С www и без
Я уже рассказывал, как правильно сделать для своего сайта редирект с адреса «www.» на обычный. Теперь поговорим о сайтах и программах, которые такими адресами оперируют.
Допустим, вам необходимо сделать таблицу БД со списком адресов. Причем, каждый сайт должен упоминаться только один раз. Очень распространенная задача, взять, хотя бы, каталоги сайтов.
Сайт можно идентифицировать по имени домена. Если бы мы жили в идеальном мире, то на этом месте мой пост бы и закончился.
Но, тут всё только начинается…
Большинство сайтов доступны (отдается HTML или происходит редирект) по двум адресам: example.com и www.example.com. В почти идеальном мире
мы бы просто отбросили «www.» и забили на эту проблему. Но находятся некоторые криворукие личности, которые обеспечивают работу своего сайта только по одному адресу, «только с www.».
Решение проблемы такое:
CREATE TABLE test(www CHAR(4),hostname CHAR(64) NOT NULL,UNIQUE(hostname));
Мы отделяем частицу «www.» и храним её отдельно, все равно смысловой нагрузки она никакой не несет. Зато теперь по нормальному имени домена можно сделать уникальный индекс.
Чтобы сделать выборку по такой таблице, можно создать отображение (VIEW), а можно просто добавить оператор CONCAT в SELECT:
SELECT CONCAT(www,hostname) AS url FROM test;
З.Ы. «www.» — это архаизм, это неудобно и непрактично. Давайте обойдемся без дискуссий на эту тему.
Filed under: Прочее | 4 Comments

Некоторые адреса без www ну совсем не смотрятся!
2Alex B.: Это тебе так кажется.
Привычка и всё такое… И вообще, нужно регистрировать такие домены, которые смотрятся нормально в любом виде.
Сорри, не удержался, а зачем хранить в www «www.»? Сделать его BOOLEAN и писать CONCAT(IF(www,’www.’,»),hostname) или вообще NULL хранить тогда IFNULL(www,’www.’).
2VolCh: главное в идее – хранить «www.» отдельно. Как его хранить – это уже другой вопрос. Я привел самый простой для понимания пример. А вообще вы всё правильно написали. Кстати, ещё можно сделать CREATE VIEW и тогда при SELECT-е никаких отличий от обычной таблицы не будет.