Поставил ODBC коннектор, настроил...
в базе MySQL все настройки, связанные с кодировкой = cp1251
Подключаюсь через adodc, просмотр соответственно в DataGrid. Чудесно подключается, все работает, но: вместо кириллических знаков - знаки вопроса.
Данные заводил через MySQL-Front. MySQL5, VB6, Connector/ODBC
Вопрос только один: КАК?
Да, вот еще: в самой проге решил поменять запись, чтобы посмотреть, как она отобразится в базе, не меняется, выдает сообщение: "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения."
Если у вас MySQL уже установлен, то для того, чтобы узнать default кодировку сервера, дайте команду:
SHOW VARIABLES;
и посмотрите значение "character_set".
Даже если вас съели - у вас есть два выхода, и тут точно так-же: вы можете изменить кодировку, в которой происходит хранение данных и сделать так, чтобы она соответствовала кодировке ваших html документов или можете включить конвертацию данных при запросе.
Например, если у вас default charser koi8-r, а вы хотите класть/получать данные в windows-1251, необходимо использовать следующую строку соединения:
$SQL.connect-string[mysql://user:password@имя_хоста:номер_порта/database?charset=cp1251_koi8]
В этом случае парсер после установления соединения с сервером MySQL будет выполнять команду SET CHARACTER SET cp1251_koi8 которая сообщает серверу, что подключившийся клиент желает, чтобы сервер отправляемые клиенту перекодировал из кодировки koi8-r в кодировку windows-1251, а принимаемые от клиента данные подвергал обратному перекодированию.
Однако имейте ввиду, что если у вас данные хранятся в кодировке koi8, а вы их кладете в windows-1251 без указания ?charset=cp1251_koi8 то ничего хорошего не получите. При запросе вы будете получать русские буквы, причем такие же, какие клали в базу, но все серверные функции типа upper, lower, order by, group by и др. нормально работать с русскими буквами не будут.
Так же имейте ввиду, что кодировка задается одна на сервер. Т.е. у одного MySQL сервера не может одна база быть в одной кодировке, а другая в другой. Соответственно, если этот сервер использовался уже кем-то до вас и там есть данные, то скорее всего вам не дадут поменять его кодировку по умолчанию.
Именно это скорее всего произойдет когда вы решите воспользоваться услугами какого-либо хостинга. Там сервер уже установлен, настроен и используется большим количеством клиентов и вам нужно узнать кодировку в которой он хранит данные и при необходимости включить перекодирование при подключении...
Еще немного про изменение default charset:
Согласно документации MySQL, после изменения default charser вы должны запустить myisamchk -r -q для всех таблиц, иначе индексы могут остаться некорректными и вы все равно будете получать некорректные результаты в результате выполнения некоторых серверных операция.
Теперь про чувствительность MySQL к регистру.
Как было замечено в документации с помощью Nexus, работа MySQL со столбцами типа CHAR, VARCHAR по умолчанию не чувствительна к регистру, т.е. если у вас в таблице есть записи а, А, Б, б, В то при сортировке они вернутся в следующем порядке: аАбБВ, а SELECT DISTINCT name FROM test ORDER BY name что-то типа: а Б В
Для того, чтобы получить результаты упорядоченными так:АБВаб (и SELECT DISTINCT ... в виде АБВаб) необходимо на столбец установить атрибут BINARY, тогда сравнение данных, хранящихся в нем будет происходить с учетом регистра.
В заключение замечу, что все вышенаписаное есть в документации по MySQL
Совсем в заключение приведу краткую инструкцию по инсталляция MySQL под Windows, она может понадобиться, если вы поставили у себя на компьютере apache + mysql для того, чтобы локально сделать сайт, а изучать документацию по MySQL вам совсем лениво (имейте ввиду, что в конце концов нежелание читать документацию выйдет вам боком)
# Инсталлируем MySQL
# Запускаем winmysqladmin.exe - получаем окошко Quick Setup и следуем инструкциям - при этом создается default my.ini в каталоге windows
# Открываем в winmysqladmin закладку "variables" и видим, что character_set стоит latin1 (это и есть default character set), так-же убеждаемся, что в character_sets перечислено большое количество кодировок, в том числе необходимая вам (koi8r или cp1251).
# Открываем закладку "my.ini Setup" и в раздел [mysqld] вписываем команду:
default-character-set=cp1251 (если вам нужна другая кодировка - пишите ее)
# Жмем кнопку "Save Modification" и рестартуем MySQL сервер (правой кнопкой по светофору, затем стоп, ... старт)
# Опять идем на закладку "variables" и убеждаемся, что character_set = cp1251
Да, чуть не забыл... Я сам проверял эту процедуру установки на MySQL версий 3.23.49 и 3.23.52. Что было раньше я к сожалению не знаю, поэтому если описаная процедура установки не работает - попробуйте скачать более новый дистрибутив MySQL.
MySQL 4.1x
Итак светлое будущее, о котором так долго говорили большевики наступило и появился MySQL 4.1x с поддержкой подзапросов и большего количества кодировок (в том числе с встроенной поддержкой UTF-8 и возможностью иметь разные кодировки на разные базы данных, таблицы и даже столбцы).
В рамках этого светлого будущего в случае использования MySQL 4.1x мы почти не зависим от настроек сервера, т.к. кодировку своей БД вы можете выбрать сами.
Начну с того что любимую команду:
SET CHARACTER SET xyz
и её парсерную интерпретацию в виде ?charset=xyz никто не отменял, и эта команда позволяет нам задать кодировку, в которой мы хотим получать данные от MySQL сервера.
Следует заметить, что в MySQL 3.xx эта команда задавала направление перекодировки (и фактически существовало лишь одно значение параметра: cp1251_koi8. И например если ваши файлы хранились в koi8-r, а default кодировка MySQL сервера была win1251 вы не могли заставить сервер выдавать вам данные в удобной для вас кодировке koi8-r), а в MySQL 4.1x она задает именно кодировку в которой данные будут отправляться клиенту, и вы можете указать любую удобную вам кодировку.
Поэтому сейчас мне кажется разумным в качестве серверной кодировки использовать UTF-8, а в качестве клиентской - кодировку, в которой вы храните файлы и использовать ?charset=кодировка_файлов в строке подключения. Почему UTF? Да потому что завтра вы захотите хранить в той же базе данных кроме русских и английских букв ещё французские/немецкие/... и вам не нужно будет ничего делать с базой данных, т.к. она уже будет готова к хранению букв на разных языках. Хотя в случае использования кодировки win1251 как кодировки вашей базы данных в общем тоже особых проблем не будет: вы сможете сделать dump вашей БД, изменить её кодировку и загрузить данные обратно. Всего-то делов.