PDA

Просмотр полной версии : MySql и UTF8 и много чего ещё...



Alezis
10.06.2005, 14:27
Люди научите.
Скачал недавно MySQL 4.1.12a. Там говориться что чарсет может быть UTF8. Мне он надо чтоб поддерживать кирилицу.
Вроде в конфигурации поставил по умолчанию UTF8 и в my.ini
default-character-set=utf8 стоит. Но когда mysql_character_set_name вызываю возвращает latin1. Вопрос:
как из приложения вставлять вынимать из базы кирилицу, т.е. UTF8.
Мот ещё кто знает какие способы как это сделать. Мот через API MyODBC будет работать, кароче хелп.
Потомучто когда вставляешь то в MySQL видишь ????, вопросы видишь и когда извлекаешь короче КАК мне это сделать. :?: :?:
как работать из приложения с UTF8.

Yurich
11.06.2005, 02:01
mysql_character_set_name возвращает default character set для текущей коннекции, а --default-character-set устанавливает default character set для сервера. Я думаю проблема в этом.

Yurich
11.06.2005, 02:03
Подробнее читай здесь (http://dev.mysql.com/doc/mysql/en/charset.html)

Alezis
11.06.2005, 11:17
да лано в принципе какая разница что она возвращает , мне надо просто из приложения туда и обратно вынимать кирилицу причём я уже не первый день занимаюсь всякой ерундой, как то вставляю вынимаю разл. способами эту кирилицу . Как итог но вообще ничего невстовляет то вопросы. Даже базу данных создал и явно указал что будет UTF8, но когда преобразую то всё равно вапросы получаются.
например есть 4 поля ID,NAME,SEX,AGE вставляю так:


SQLINTEGER id;
char name[30];
SQLINTEGER age;
SQLCHAR sex;

SQLBindParameter(hstmt,1,SQL_PARAM_INPUT, SQL_C_LONG,
SQL_INTEGER, 0,0, &id, 0, NULL);
SQLBindParameter(hstmt,2,SQL_PARAM_INPUT, SQL_C_TCHAR,
SQL_VARCHAR, 0,0, name, 0, NULL);
SQLBindParameter(hstmt,3,SQL_PARAM_INPUT, SQL_C_TCHAR,
SQL_CHAR, 0,0, &sex, 0, NULL);
SQLBindParameter(hstmt,4,SQL_PARAM_INPUT, SQL_C_LONG,
SQL_INTEGER, 0,0, &age, 0, NULL);

sex= 'm';
int num = 0;
WCHAR names[30];
wcscpy(names,L"йцу");
const int nSize = sizeof(names)/sizeof(WCHAR);
char szText[nSize + 1] = "";
WideCharToMultiByte(CP_UTF8, 0, names, -1, szText, nSize, NULL, NULL);
strcpy(name,szText);
age = 12;
for (id = num; id < num +10 ;id++)
{
retcode = SQLExecute(hstmt);
}

Yurich
11.06.2005, 11:56
Каким запросом ты создал БД и таблицу? Пробовал ли ты вставлять в БД записи с русскими значениями полей из консоли и там же выбирать их select'ом? Если нет, то для начала я бы посоветовал сделать это и в случае неудачи добиться, чтобы именно из консоли все работало отлично.

Yurich
11.06.2005, 11:57
да лано в принципе какая разница что она возвращает

Разница в принципе небольшая, а именно будет ли работать твое приложение или нет... :wink:

Alezis
11.06.2005, 17:59
да лано в принципе какая разница что она возвращает

Разница в принципе небольшая, а именно будет ли работать твое приложение или нет... :wink:
Вообще то mysql_character_set_name только использовал как индикатор проблемы и только, пускай оно себе и не возвращает то что надо главное чтоб работало. Ну да лано зарываю топор вражды извинте если чем обидел. Я здесь просто для того чтоб сказать что уменя всё заработало но об этом потом. Ещё один момент.

Каким запросом ты создал БД и таблицу? Пробовал ли ты вставлять в БД записи с русскими значениями полей из консоли и там же выбирать их select'ом? Если нет, то для начала я бы посоветовал сделать это и в случае неудачи добиться, чтобы именно из консоли все работало отлично.
Всё это делал и кодировки ставил и koi8r и всякие другие, в том числе и UTF8. если стояла utf8 то всё вставлялось и отображалось, нов консоли были всё равно ????. Оказалось просто напросто что
для русских букв тестирование через command line не подходит, т.к. там используются DOS-кодовые таблицы. поэтому и выдавалось ???.Посмотрел через MySQL Query Browser всё в поряде всё стоит русское.
Так теперь о том как это получилось:
просто создал бд с utf8.


CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]

create database db_name character set utf8.
а потом просто
вставлял строку переведённую в UTF8 с помощью
WideCharToMultiByte(CP_UTF8, 0, names, -1, szText, nSize, NULL, NULL);
и всё заработало. Теперь тама (в бд кириллица). Правда вынимаешь теперь тоже UTF8, а как перевести это чудо обратно пока не придумал, т.к.
MultiByteToWideChar(CP_UTF8,0,szText,-1,names,MAX_PATH); как то возвращает только половину слова. Может кто ещё знает как это исправить, впрочем это совсем другая история.... :lol:
Спасибо тебе Yurich что делился предложениями. Тема закрыта.