Задавайте вопросы, мы ответим
Вы не зашли.
Моя программа написанная на C++ поддерживает 2 базы данных: MS Acces и MySql.
При старте программы пользователь сам решает с какой базой он желает работать.
Причем MySql работал с русской кодовой страницей cp1251, теперь появилась необходимость перевести программу на Юникод.
Я перекомпелировал программу под Юникод, теперь в самой программе все нормально, т.к. при записи в файл латышских символов, таких как "ūšščēž", они нормально считываются из файла,
именно так, как я их записал. К тому же при работе с базой данных MS Access, тоже все нормально, т.е если я пишу команду
insert into some_table (some_field) values ('ūšščēž');
они тоже считыватся и отображаются на экране именно так, как я их записал в базу.
Т.е. получается, что с моей программой, как "клиентсой программой", вроде бы все нормально.
Но вот при работе с MySql ничего не получается.
Если я посылаю в MySql указанную выше команду, то в ответ я получаю не латышские символы ūšščēž, а их прототипы usscez.
Теперь что я сделал с Mysql.
1. сразу после установки соединения с MySql, я выполняю команды
SET NAMES utf8; SET CHARACTER SET utf8; set character_set_client='utf8'; set character_set_results='utf8';
после этого MySql возвращает мне всякую "гадость" типа Прием первичного пациента, оформление документации
команда
show variables like '%%char%%'
возвращает везде значения utf8, кроме character_set filesystem=binary
2. далее, я первожу базу данных, все таблицы и все поля в формат utf8
ALTER DATABASE `some_database` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE `some_table` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE `some_table` CONVERT TO CHARACTER SET %s; ALTER TABLE `some_table` CHANGE `some_field` `some_field` field_type CHARACTER SET utf8 COLLATE cp1251_general_ci;
но Это не помогает, я попрежнему вижу всякую "гадость типа" Прием первичного пациента, оформление документации
Если пишу латышские символы, то попрежнему возвращается не то что надо.
Пробовал также сделать dump базы данных и затем заменить все символы cp1251 на utf8, и обратно загнать в базу. Опять не помогает.
Что я делаю не так?
спасибо
Неактивен
Ну, это не гадость. Когда Вы выполняете команду «SET NAMES utf8», Вы говорите MySQL
буквально следующее: «Я работаю в кодировке UTF8, поэтому будь добр посылай мне
данные в этой кодировке». Ваша программа же запущена в виндоус, где по умолчанию
стоит (да-да, правильно) cp1251 (или в юникодном случае ucs2). В результате получается,
что данные приезжают к Вам в utf8, а Вы ожидаете их в другой кодировке.
Решения два — или не обманывать MySQL и честно признаться, что Вы работаете не в utf8,
или обращаться со строками, приехавшими из MySQL, как со строками utf8 (и конвертировать
их внутри программы). Подозреваю, что первое заметно проще (SET NAMES ucs2).
Неактивен