Thursday, 6 March 2014

MySQL error getting DDL for object

"Error getting DDL for object
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER `mark`.`evaluation_insert`"

MySQL Workbrench ажиллаж байгаад байгуулсан хүснэгтээ засварласны дараа  "Error getting DDL for object
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER `mark`.`evaluation_insert`" ийм алдаа гарч ирлээ.
Ингэснээр дахин энэ хүснэгтийг засварлах боломжгүй болж, "alter table" дарах болгонд

 энэ алдаа гарч  ирэх болов. Энэхүү алдаа нь хүснэгтэд баганы тайлбарыг юникод үсэг бичигдсэнтэй холбоотой юм байна. Хүснэгтийн баганыг засварласны дараа тухайн баганы тайлбар дахь юникод үсгийг танихаа байсан байна. Тэгвэл энэ асуудлыг шийдвэрлэхийн тулд тухайн баганы тайлбарыг sql statement ашиглан дахин засварлахад болно.
 

Alter table tbl_attend
modify total_in_time BIGINT(11) Comment "총 참여시간";

Ер н бол хүснэгтэд COMMENT бичих хэрэггүй бололтой.

Friday, 28 February 2014

MySQL болон C хэл рүү монгол кириллээр өгөгдөл бичих, унших. ө ү үсэгний асуудал

MySQL дээр database-ээ анх байгуулахдаа utf8_unicode_ci эсвэл utf8_general_ci энэ хоёрын аль нэгээр хадгалаарай. utf8_general_ci нь арай хурдан боловч utf8_unicode_ci нь илүү тодорхой гэсэн байна. Би програм бичихдээ алийг нь хэрэглэж байснаа мартчихаж.

С хэлээр бичигдэж буй програмаас дээрх монгол кирилл өгөгдөл хадгалагдсан байгаа database-н хүснэгт рүү монгол кирилл үг орсон sql statement явуулах, мөн монгол кирилл үг орсон өгөгдөл авчрах жишээ кодыг тайлбартай нь тавья.
1. Эхний method DB-тэй холбохын тулд тохиргоо хийх method
*5р мөр : Database-ээ utf8аар хадгалсан учраас DB-холболтоо utf8-р тохируулж өглөө.
Иймээс DB рүү илгээх query болон DB-ээс ирэх result нь utf8-р кодлогдсон байгаа.
1. MYSQL* connectDB(void)
2. {
3.     MYSQL *conn;
4.     conn = mysql_init(NULL);
5.     mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8");
6.     mysql_options(conn, MYSQL_INIT_COMMAND, "SET NAMES utf8");
7.     mysql_real_connect(conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306, (char *)NULL, 0);
8.     if(conn == NULL)
9.    {
10.       fprintf(stderr, "Mysql connection error : %s", mysql_error(conn));
11.       exit(0);
12.  }
 13.      return conn;
14.}

2. Хоёр дахь method DB рүү query-г илгээж, DB-с ирэх хариуг хүлээн авах үүрэгтэй.
Энэхүү method-ын эхний parameter нь wchar_t type-тай query нэртэй string байна. Би дээрийн бичлэг дээрээ C хэлэн дээр монгол кирилл үсгийг зөв хадгалахын тулд wide character type-г ашиглана гэж бичсэн. Тэгэхээр энэхүү query string маань unicode -оор кодлогдсон байгаа. Харин mysql database дэх монгол кириллээр бичигдсэн өгөгдөл маань utf8-аар кодлогдсон байгаа. Тиймээс DB рүү илгээх query-гээ utf8-аар кодлож байж илгээх ёстой. Тэгэхгүй бол кириллээр бичсэн үгийг зөв тайлж уншиж чадахгүй кодлосон арга нь өөр учраас.
 *2р мөрөнд : "char * UNIToUTF(wchar_t*)" -г ашиглаж query-н кодыг Unicode-с UTF8-руу хувиргалаа. Сайн ажиглаарай UNIToUTF нэртэй method -ний оролт нь wchar_t* type-тай байсан бол гаралт нь char * type-тай байна.
*3р мөрөнд : Ингэж хувиргасан query-гээ (queryChar)
mysql_real_query method-г ашиглан db рүү явууллаа.
*10р мөрөнд db-ээс хариу result-авчирлаа.
1.MYSQL_RES * fetch_result(wchar_t * query, MYSQL * conn){
2.    MYSQL_RES * res;
3.    int query_stat;
4.    char * queryChar = UNIToUTF(query);
5.   query_stat = mysql_real_query(conn, queryChar, strlen(queryChar));
6.   if(query_stat)
7.   {
8.        fprint(stderr, "Mysql query error : %s", mysql_error(conn));
9.   }
10.   res = mysql_store_result(conn);
11.   return res;
}

3.
*7, 8р мөр : DB-ээс ирсэн хариу өгөгдөл маань utf8-аар кодлогдсон байгаа тул UTF8ToUNI гэсэн method-г ашиглан Unicode руу хувиргана.
1. wchar_t query[256];
2. wcscpy(query, L"select col1, col2 from table1 where col1 like 'өглөө' ");
3. MYSQL_RES *res;
4. MYSQL_ROW row;
5.  res = fetch_result(query, conn);
6.  while((row=mysql_fetch_row(res))!=NULL){
7.  wchar_t * col1 = UTF8ToUNI(row[0]);
8.  wchar_t * col2= UTF8ToUNI(row[1]);
....
4. Хамгийн сүүлийн хоёр method бол та бүхэн өөрийнхөө кодод тэр чигээр нь хуулж аваад ашиглах хамгийн гол method-ууд байгаа.
*4 болон 6р мөрөнд ижил method-г дуудсан боловч сүүлээсээ гурав дахь parameter-ээс шалтгаалж 2 өөр үйлдэл гүйцэтгэнэ.
*4р мөрөнд сүүлээсээ гурав дахь parameter буюу string-н уртыг 0р өгвөл whcar_t type- р хадгалагдсан string-г utf8 руу хадгалахад хэр их багтаамж шаардлагатайг хэмжиж өгнө.
*5р мөрөнд HEAP-т дээрх мөрөнд хэмжсэн хэмжээний багтаамжтай зайг гаргаж, түүнийхээ хаягийг strUTF8 -д хадгалууллаа.
*6р мөрөнд энэ урьдчилан бэлдсэн зайндаа strUNI-д байгаа Unicode-р кодлогдсон үгийн utf8 рүү хувиргаж хадгална.
1.char* UNIToUTF8(const wchar_t * strUNI)
2.{
3.    char * strUTF8=NULL;
4.    int nLen = WideCharToMultiByte(CP_UTF8, 0, strUNI, -1, strUTF8, 0, NULL, NULL);
5.    strUTF8 = (char*)malloc(nLen+1);
6.    WideCharToMultiByte(CP_UTF8, 0, strUNI, -1, strUTF8, nLen, NULL, NULL);
7.    return strUTF8;
8.}
wchar_t* UTF8ToUNI(const char* strUTF8)
{
 wchar_t * strUnicode;
 int nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, lstrlen(strUTF8)+1, NULL, NULL);
strUnicode = (wchar_t*)malloc(nLen+1);
 MultiByteToWideChar(CP_UTF8, 0, strUTF8, lstrlen(strUTF8)+1, strUnicode, nLen);
 return strUnicode;
}

За өөрийнхөө дээр бичиж байсан кодыг ашиглан жишээ авч чадах ядахаараа тайлбарлалаа. Зарим нэг нэр томьёог монголоор хэлж мэдэхгүй болохоор шууд англиар биччихлээ.
Би өөрөө энэ асуудлыг шийдэх гэж хэдэн өдөр болж байсан шиг санагдаж байна. Дараа дараагийн хүмүүс маань нэгнийхээ туршлаган дээр суурилаад хийвэл хамтаараа илүү олон асуудлуудыг шийдэж чадах болов уу. Та бүхэнд амжилт хүсье.

keyword : mongolian cyrillic word, mysql table record, c programming language

Friday, 21 February 2014

MySQL error code 1175

MySQL safe mode/ аюулгүй төлөвт байхад table update/delete хийхэд WHERE дээр хүснэгтийн индекс ороогүй бол error code 1175 алдаа гарна. Аюулгүй төлөв нь хүснэгтийн өгөгдлүүд олноороо устгагдахаас сэргийлж байгаа юм. Дараах query-аар энэхүү тохиргоог арилгасны дараа update-хийвэл болно.
SET SQL_SAFE_UPDATES = 0;

Monday, 3 February 2014

MySQL view

Тодорхойлолт

View нь байнга хэрэглэгддэг, төвөгтэй select query-г хадгалах зорилготой ба хиймэл хүснэгт(virtual table) гэж нэрлэгдэх нь бий. Учир нь view нь яг table-тэй адилхан багана, мөртэй боловч жинхэнэ өгөгдөл энд хадгалагдаж байгаа биш юм. Гол зорилго нь join -г ашиглан хэд хэдэн өөр table болон view-ээс төвөгтэйгээр гаргаж авах өгөгдлийг хадгалж, дараа нь хялбар аргаар энэхүү өгөгдлийг харах боломжтой. Мөн шаардлагатай нөхцөлийг хангасан тохиолдолд View-ийг ашиглан жинхэнэ өгөгдлийг шинэчилэх боломжтой.

Давуу тал

1. Хэцүү query - г хялбарчилж өгнө. Олон өөр өөр table-ээс өгөгдлийг гаргаж авах урт, төвөгтэй query-ийг view болгон хадгалж, энэ төвөгтэй query-г байнга хэрэглэхийг оронд view-ийг ашиглан амархан select query-ээр өгөгдлийг харж болно.
2. Зарим хэрэглэгчдэд тодорхой өгөгдлийг харуулахгүйгээр хязгаарлах боломжтой.
3. Зөвхөн өгөгдлийг харах боломжтой (read only) view-ийг байгуулж, өгөгдлийг өөрчлөх боломжгүй хамгаалалт үүсгэж болно.
4. Өөр өгөгдлөөс тооцоолон гаргах боломжтой өгөгдлийг view-д хадгалах боломжтой. Table-д ингэж тооцоолон гаргах боломжтой өгөгдлийг хадгалбал ой санамжийн зайг үр ашиггүй хэрэглэсэн болно.

Сул тал

1. View өөр view-ээс үүссэн бол өгөгдлийг тооцоолон гаргахад бага зэрэг удна.
2. Table-ээс үүсгэдэг учраас table өөрчлөгдөхөд view-г ч мөн өөрчлөх шаардлагатай болдог.

Monday, 5 August 2013

Монгол кирилл бичгийн ө, ү үсэг мөн монгол бичгийг С хэлэнд таниулах

Энэ сэдвээр нэлээн дээрээс бичмээр байсан ч зав болохгүй байсаар өдийг хүрлээ.
С хэл дээр ямар нэгэн мэдэхгүй зүйл гарахад Googlees хайгаад асуултынхаа хариуг англи болон бусад хэл дээр амархан олчихно. Гэхдээ тэр бүр хайж олдоод байхгүй сэдэв бол яг одоо бичиж буй, монгол хэл монгол бичигтэй холбоотой сэдэв юм. Англи, солонгос зэрэг хөгжингүй орнуудын хэлтэй харьцуулахад манай монгол хэлний компьютерийн шинжилгээний ажил өргөн хөгжөөгүй байгаа болохоор энэ тал дээр програмчид маань их бэрхшээлтэй хувь хувьдаа тулгарч байдаг байх. Яг одоо миний бичиж буй сэдвийн бэрхшээл тулгарсан хүн байвал наашаа анхаарлаа хандуулна уу. Би өөрөө энэ бэрхшээлээ давах гэж хэчнээн өдөр зарцуулсан болохоор дараа дараачийн хүмүүстээ энэ туршлагаасаа хуваалцахыг хүсч байна. Уншигч та энэ бичлэгийг ашиглан асуудлаа шийдвэрлэж чадвал миний энэ блогийг бичиж буй зорилго хэрэгжиж байна гэсэн үг юм.

С хэлэнд /string/ үгтэй ажиллахад ер нь анх суралцагсдад хэцүү байдаг.
string хадгалах зориулалттай char type өргөн хэрэглэдэг байх. Гэтэл энэ type-г ашиглан бичсэн дараах кодуудыг харцгаая.

char * ch = "аав";


Ингэж бичихэд аав гэдэг үг зөв уншигдана. Гэтэл

char * ch = "өвөө";



гэвэл ?????? буюу асуултын тэмдэгнүүд л уншигдана.

Тиймээс үгээ хадгалахдаа char биш wchar_t -г ашиглаарай
Жишээ нь:

wchar_t * ch = L"өвөө";









wchar_t * ch = L"ᠡᠪᠦᠭᠡ";





Таны хүссэн хариу хэвлэгдэх болно. Энэ жишээ шиг зүгээр нэг хэвлэхдээ гол нь биш С хэл таны оруулсан үгийг үнэн зөвөөр нь уншиж чадаж байна гэсэн үг юм.
Дараагийн удаа MySQL С хэлтэй хэрхэн хослуулах вэ, DBд байгаа монгол үсгээр хадгалсан датаг хэрхэн С хэл рүү унших вэ, DB рүүгээ хэрхэн монгол үсгээр бичсэн үг орсон query явуулах тухай бичих болно.

Friday, 19 July 2013

C/C++ Microsoft Visual Studio build хийхэд гардаг FATAL ERROR LNK1120

Өнөөдөр кодоо засч байгаад ийм алдаатай тулгарлаа.

error LNK2001: "struct st_mysql_res * __cdecl fetch_result(class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraitsCRT<char> > >,struct st_mysql *)" (?fetch_result@@YAPAUst_mysql_res@@V?$CStringT@DV?$StrTraitATL@DV?$ChTraitsCRT@D@ATL@@@ATL@@@ATL@@PAUst_mysql@@@Z) 외부 기호를 확인할 수 없습니다.
1>E:\VStudio\projects\test\Debug\test.exe : fatal error LNK1120:

Ямар ч байсан fetch_result нэртэй функц, CString нь функцын параметерийн нэр. Тухайн үедээ шууд алдаагаа ойлголгүй Google-ээр баахан хайлаа.
Эцэст миний хийсэн алдаа бол

MYSQL_RES * fetch_result(CString, MYSQL *);
Анх функцээ зарлахдаа эхний параметерийг CString гэсэн мөртлөө сүүлд функц доторхийг засч эхний параметерийг char* луу сольсон байгаа юм.


MYSQL_RES * fetch_result(CString, MYSQL *);  // функц зарласан хэсэг


,,,

MYSQL_RES * fetch_result(char * query, MYSQL * conn)
{
 MYSQL_RES * res;
....
....
...
 return res;
}

Тэгэхээр энэхүү алдаа нь
1т. Зарлаагүй функцийг дуудсан ториолдолд (минийхтэй адил тохиолдол)
2т. main функц байхгүй тохиолдолд гардаг юм байна.
Ер нь програм бичихдээ маш анхааралтай байхгүй бол анхааралгүйгээсээ болж алдаагаа засах гэж хамаг цагаа зарцуулах хэрэг гарна.


Энэ бичлэг маань С хэлний тухай анхниы бичлэг болж байна. Яг монголоор сураагүй болохоор тайлбарлаж бичихэд зарим хэллэгүүдийг буруу хэрэглэж байж магадгүй. Гэхдээ та бүхэнд програм бичихэд чинь миний блог бага ч гэсэн тус болно гэдэгт итгэлтэй байна.




Monday, 27 May 2013

Анхны тэмдэглэл
Өнөөдөр би анхны блогоо нээж байна.
Минийй хувьд програм бичих явцад ямар нэгэн мэдэхгүй зүйл гарахад Google хайлтыг их хэрэглэдэг. Тэр бүрд англи юмуу солонгосоор бичиж хайдаг. Учир нь монголоор бичихэд яг холбогдолтой бичлэг маань гарч ирдэггүй юм. Тиймээс энд би өөрийн програм бичих явцад хуримтлуулж буй туршлагаасаа бичиж байх болно.Энэхүү тэмдэглэл маань цаашид миний мартсанаа эргэн санах тэмдэглэл болохоос гадна яг одоо энэ блогийг үзэж буй хэн нэгэнд програм бичихэд үүсч буй бэрхшээл, алдааг засахад туслах заавар болно гэж бодож байна.
Эцэст нь хэлэхэд "Хүнд 1%ийн авьяас 99%ийн хичээл зүтгэл хэрэгтэй байдаг юм шүү. Шантралгүй хичээгээрэй."