Кодировка в MySQL под Виндой

4m@t!c

Александр
Кодировка в MySQL под Виндой

Писал код не заморачиваясь на кодировки в таблицах. Не хотел лезть в Мускул, пока более-менее не буду себя уверено чувствовать в азах РНР. Тут стукнуло мне в голову, Что БД у меня на русском и желательно что бы инфа была на русском.
1. Не нашел четкого механизма работы кодировок - все что нашел - это http://koi8.pp.ru/pos.html. Прочел и все равно не понял. я пишу страницу в PHPEditor, не заморачиваясь, на кодировки. Но что бы передать информацию, я должен знать в какой кодировке пишет тот или иной редактор так что ли? Если так, то у никсов есть понятие локаль, где они задают кодировку и форматы. В винде есть Региональные стнадарты и про кодировку и локаль нет и речи.
подумал, черт с ним. Будем думать что в винде локаль cp1251.
2.Залез в Мускул посомтрел кодировки таблиц - оказалось - latin1_swedish. Взял и поменял на cp1251.
Теперь такая картина
character_set_client - latin1
character_set_connection - latin1
character_set_database - cp1251 character_set_results - latin1
character_set_server - latin1 character_set_system - utf8 character_sets_dir - c:\mysql\share\charsets/
collation_connection - latin1_swedish_ci
collation_database - cp1251_general_ci collation_server - latin1_swedish_ci
Решил, что везде должно быть cp1251 - но как это сделать под виндой - я не нашел. Везде, где я читал- примеры под никсы. Как мне сделать все в ср1251?
Нашел тред на форуме, что my.cnf не настроит кодировку, как надо. причем я не понял чью кодировку, за Collation вообще речь не шла.
Нужно использовать set names 'cp1251'.
Читал-читал и вычитал, что несмотря на то, что даже если указывать кодировки, то при некоторых манипуляциях нужно указывать кодировки. Как из тех, что дает show variables опять же я не нашел нигде.
Чего-то намудрил с кодировками получилось вообще классно начало выдвать ошибку
[root@localhost:3306] ERROR 1267: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
Ошибку устраняет SET names 'cp1251'
И теперь show variables выдает
character_set_client - cp1251
character_set_connection - cp1251
character_set_database - cp1251
character_set_results - cp1251
character_set_server - latin1
character_set_system - utf8
character_sets_dir - c:\mysql\share\charsets/
collation_connection - cp1251_general_ci
collation_database - cp1251_general_ci
collation_server - latin1_swedish_ci
как итог -я ничего не понял и окончательно запутался. А теперь вопрос.
Где можно прочесть для тех, кто в танке о кодировках, о том, какие настройки за что отвечают, а не так абстрактно как в пункте "4.1.1" маны.
И еще, можно ли все оставить в в latin1 или нет - я так понял, что там есть русские буквы, а когда буду делать запросы, то буду COLLATION'ом задавать порядок сортировки?
З.Ы. Вообщем я расстроился, что я ничерта не понимаю, и что у меня нет мозгов найти нормальные линки на нужные мне темы. Буду признателен за любую помощь.
 

SiMM

Новичок
> Но что бы передать информацию, я должен знать в какой кодировке пишет тот или иной редактор так что ли?
А как же иначе? Ты же исходя из каких-то соображений указываешь charset в метатэге?

> подумал, черт с ним. Будем думать что в винде локаль cp1251.
Для русской локали винды можешь продолжать так же думать в большинстве случаев.

> в latin1 ... я так понял, что там есть русские буквы, а когда буду делать запросы, то буду COLLATION'ом задавать порядок сортировки?
Нету там русских букв. Букв вообще нигде нету. Это фикция. Зато есть байты. А так же некоторый набор функций (типа перевода в нижний/верхний регистр), которые переводят одни байты в другие и результат которых зависим от используемой кодировки букв. Кодировки букв байтами. Ну и до кучи есть ещё набор правил (типа упорядочивания), которые опять же зависят от кодировки.
 

4m@t!c

Александр
>А как же иначе? Ты же исходя из каких-то соображений указываешь charset в метатэге?
Т.е. у всех текстовый файлов есть поле, где стоит пометка, какой кодировкой пользоваться при прочтении? так?

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

>Нету там русских букв. Букв вообще нигде нету. Это фикция. Зато есть байты. А так же некоторый набор функций (типа перевода в нижний/верхний регистр), которые переводят одни байты в другие и результат которых зависим от используемой кодировки букв. Кодировки букв байтами. Ну и до кучи есть ещё набор правил (типа упорядочивания), которые опять же зависят от кодировки.
Т.е. нужно найти спецификацию по кодировке и глянуть, есть ли там изображение русских симоволов, если есть то можно смело использовать, не забыв указать, какой кодировкой пользуюсь? Единственная проблема, которая может возникнуть - это отсутсвие кодировки (как она выглядит? просто файл, в котором хранится соотвествие байтов символам).
как я понял именно collation отвечает за порядок сортировки так?

Я непонимаю вот какого момента. Если кодировки есть и их название известно, то, почему MySQL знает в каком формате он хранит данные, в каком формате обращается к нему клиент, но не может вывести текст клиенту в нужной кодировке? почему?
 

SiMM

Новичок
Базе, насколько я понимаю, вообще пофиг какие данные и в какой кодировке хранить. Она просто хранит байты. И даже не знает, каким символам они сопоставлены. Все эти извраты с кодировками нужны базе только для:
1) строковых операций типа strtolower
2) сравнения без учёта регистра (частный случай 1)
3) сортировки
4) преобразования из одной кодировки в другую на лету
Как выглядят всякие разные кодировки и какому байту в них какой символ соответствует можешь глянуть здесь и здесь.
По поводу проблем с MySQL 4.1 ничего конкретного сказать не могу (может кто другой подскажет чего) - не пользовал.
 

4m@t!c

Александр
Спасибо за разъяcнения и за помощь... Хоть что-то стало прояняться.
Не понял фразы
"Базе, насколько я понимаю, вообще пофиг какие данные и в какой кодировке хранить. Она просто хранит байты. И даже не знает, каким символам они сопоставлены."
Перефразиру, пожалуйста, потому что я чуть со стула не упал ,когда услышал. Я-то думал, что бы добраться до рисунка символа(однозначо идентифицировать символ) нужно знать 1. Имя кодировки 2. Номер символа в кодировке. как, не зная кодировки, можно однозначо идентифицировать символ?
Я кроме Винды ничего не знаю. В никсах кодировка отличная от cp1251, если я под никсами написал НТМL страницу, и размещаю хост на Винде, то в META я должен написать кодировку локали, в которой создавалсь страница, т.е. никсовую кодировку??

-~{}~ 01.02.05 19:54:

Открыл Хекс-редактором html-пагу. В ней нет никаких данных о кодировке. В ней нписано в мете KOI8-R. Весь русский текст ввиде тарабарщины. Открыл редактором свои созданные паги - текст читаемый. Т.е. я прав, что текст-источник зависит от так называемой локали?
 

SiMM

Новичок
> Перефразиру, пожалуйста, ... как, не зная кодировки, можно однозначо идентифицировать символ?
Ок. Говоря твоими терминами - базе вообще не нужен рисунок символа. А зачем? Рисунок - не её проблемы, а её проблемы относительно кодировки я перечислил постом выше.

> В никсах кодировка отличная от cp1251
Если всё же называть вещи своими именами - то в *nix'ах скорее всего другая системная кодировка.

> если я под никсами написал НТМL страницу, и размещаю хост на Винде, то в META я должен написать кодировку локали, в которой создавалсь страница, т.е. никсовую кодировку??
Под какой осью ты написал текст - не имеет никакого значения. Значение имеет лишь то, в какой кодировке ты его сохранил. А тэг мета ты должен указывать в любом случае, и его значением должна быть кодировка редактора.

> Весь русский текст ввиде тарабарщины.
Смени кодировку в редакторе ;)

> Т.е. я прав, что текст-источник зависит от так называемой локали?
Нет. Она зависит от кодировки, в которой текст был сохранён (думаю, понятие локаль тут неуместно - редакторы могут поддерживать несколько кодировок). Открой текст под *nix'ом в hex-редакторе, открой в Windовом хексредакторе - коды символов не изменятся. Изменится лишь вид символов, которым соответствуют эти коды. Любой текст - это всего лишь набор байтов - как их показывать при выводе текста пользователю - не проблема БД.
 

4m@t!c

Александр
Бред какой-то.
MySQL 4.1.3, WindowsXP Home SP1
Решил переделать кодировку с Latin1 на cp1251. Сделал Alter... с соотвествующими Charactet set и Collation для БД и для таблиц в ней. Изменить настроки кодировки для клиента и для сервера - у меня ума не хватило(character_set_clientб character_set_connection, character_set_server, collation_connection, collation_server). Пытался делать описание в my.cnf - Мускул вообще отказался стартовать. Все что смог сделать - это пока не сделаю SET NAMES 'cp1251' - выдает ошибку о Collation нужна latin1.
Плюнул и решил все поменять ВЗАД. Опять тот же Alter для БД и для таблиц в ней для окдировки Latin1. Начал работать с таблице, в которой в процессе этих тестов происходили манипуляции типа Инсерт, Делит. А мне выдает опять ошибку, но теперь Collation по поводу того, что нужно cp1251. SHOW VARIABLES выдает, что у меня все Latin1, система UTF8 - никакой речи о ср1251 не идет. DESCRIBE не выдал никаких сообщений о кодировках. Благо у меня есть MySQLCC. Лезу в него и смотрю скрипт для создания данной таблицы.. так там для каждого поля установлен character set cp1251.
Дропаю таблицу. Создаю занов - все заработало, как часы.
Теперь вопросы.
1. Как в винде задать по умолчанию значения кодировок для сервера, для клиента, для колейшен?
2. как посомтреть, какая кодировка для каждой строчки? DESCRIBE не помог.
3. Как храняться данные в таблице? Интересует момент кодировок. Т.е. хранятся байты инофрмации, на них накладывается маска ввиде кодировки? так И для того, что бы поменть кодировку нужно сначало загнать char в blob, а потом в опять в char, но сновой кодировкой?
4. Какого-то черта у меня character_sets_dir - c:\mysql\share\charsets/. Прошу обратить внимание на слеш вконце строки. Это так и должно быть? По идее - не должно, тогда как поменять?
З.Ы. Протрахался уже 2 дня. Нигде не нашел толково почитать о кодировках, о том, как настроить Мускул (пункт 4.1. - абстрактный фонарь), а SET NAMES 'кодировка' при каждом коннекте - это ж не выход. не спорю, что collation - это, что надо, вот только вразумительного объяснения этой новой фичи мускула я не нашел.
Злой, как собака.. на себя в первую очередь, что баран, не знаю, как решить задачи.
З.З.Ы. Буду признателен за любую помощь и ответ на вопросы. Растолкуйте, как для тех. кто только что вылез из танка.. или урлой промеж глаз.
 
Сверху