- °³¿ä
- Áý¾î³Ö±â
- °¡Á®¿À±â
- Âü°í
1 °³¿ä
MySQL »ó¿¡¼ BLOB(Binary Large OBject)À» »ç¿ëÇÏ´Â ¹æ¹ý¿¡ °üÇÑ ¹®¼´Ù. ±âº»ÀûÀÎ »çÇ×Àº
MySQL »çÀÌÆ®¸¦ Âü°íÇϱ⠹ٶõ´Ù.
2 Áý¾î³Ö±â
MySQL »ó¿¡¼ BLOBÀ» Å×ÀÌºí¿¡ Áý¾î³Ö´Â ÀÏÀº MS-SQL º¸´Ù´Â ÈξÀ °£´ÜÇÏ´Ù. ±×³É ¹®Àڿó·³ Áý¾î³ÖÀ¸¸é µÈ´Ù. ´Ü ÀÏ¹Ý ¹®ÀÚ¿Àº ¾Ë´Ù½ÃÇÇ '\0' ¹®ÀÚ·Î ³¡³´Ù. ±×·±µ¥ ¹ÙÀ̳ʸ® µ¥ÀÌÅÍ¿¡´Â '\0' ¹®ÀÚ°¡ Áß°£¿¡ µé¾î°¥ ¼öµµ ÀÖÀ¸´Ï À̸¦ º¯È¯ÇØÁà¾ßÇÑ´Ù. º¯È¯ÇÑ µ¥ÀÌÅÍ ¾ÕµÚ¿¡´Ù SQL ¹®ÀåÀ» ºÙ¿©¼ mysql_real_query¸¦ È£ÃâÇÏ¸é µÇ´Â °ÍÀÌ´Ù.
MySQL¿¡¼´Â ÀÌ ÀÛ¾÷, Áï ¹ÙÀ̳ʸ® µ¥ÀÌÅÍ ¼Ó¿¡ Æ÷ÇÔµÈ escape ¹®ÀÚµéÀ» ÀÏ¹Ý ¹®ÀÚ¿·Î º¯È¯ÇØÁÖ´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
unsigned long mysql_real_escape_string(
MYSQL *mysql, char *to, const char *from, unsigned long length)
±×·±µ¥ ÀÌ ÇÔ¼ö°¡ ¿©·¯°¡Áö·Î ¹®Á¦°¡ ¸¹´Ù. ij¸¯ÅÍ ÀÎÄÚµù°ú °ü·ÃµÈ ±â´ÉÀÌ ÀÖ´Ù°í ¼³¸íÀÌ µÇ¾îÀÖÁö¸¸,
http://www.mysql.com/doc/en/mysql_real_escape_string.html ¿©±â °¡¼ ¹ØÂÊ¿¡ »ç¿ëÀÚµéÀÌ ´Þ¾Æ³õÀº ¸» º¸¸é ¾Ë°ÚÁö¸¸, Á¦´ë·Î µÇÁö ¾Ê´Â ¸ð¾çÀÌ´Ù. °Ô´Ù°¡ º¼·£µå¿¡¼´Â ÀÌ»óÇÏ°Ô ¸µÅ© ¿¡·¯°¡ ³´Ù. ±×·¡¼ ÀÌ ÇÔ¼ö¿Í ¶È°°Àº ÀÏÀ» ÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù.
unsigned long convert_escape(char* to, const char* from, size_t from_length)
{
char* start = to;
for (size_t i=0; i<from_length; i++)
{
if (from[i] == '\0') {
const char* token = "\\0";
memcpy(to, token, strlen(token));
to += strlen(token);
}
else if (from[i] == '\n') {
const char* token = "\\n";
memcpy(to, token, strlen(token));
to += strlen(token);
}
else if (from[i] == '\r') {
const char* token = "\\r";
memcpy(to, token, strlen(token));
to += strlen(token);
}
else if (from[i] == '\'') {
const char* token = "\\'";
memcpy(to, token, strlen(token));
to += strlen(token);
}
else if (from[i] == '"') {
const char* token = "\\\"";
memcpy(to, token, strlen(token));
to += strlen(token);
}
else if (from[i] == '\\') {
const char* token = "\\\\";
memcpy(to, token, strlen(token));
to += strlen(token);
}
else {
*to = from[i];
to++;
}
}
return (unsigned long)(to - start);
}
ÇÔ¼ö ³»¿ëÀ» º¸¸é ¾Ë°ÚÁö¸¸ ÃÖ¾ÇÀÇ °æ¿ì, to ¹öÆÛ´Â from ¹öÆÛº¸´Ù 2¹èÀÇ Å©±â¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ±×¸®°í ÀÌ´Â mysql_real_escape_string ÇÔ¼öµµ ¸¶Âù°¡Áö´Ù. ±×·±µ¥ mysql »çÀÌÆ®¿¡´Â ÀÌ·± ¼³¸íÀÌ ¾ø´Ù. Á¹¶ó ¯³´Ù. ¾î·µç À§ÀÇ ÇÔ¼ö´Â Å×½ºÆ®Çغ¸´Ï º° ÀÌ»ó ¾øÀÌ Àß µ¹¾Æ°¬´Ù. ¾Æ·¡ÀÇ ¼Ò½º´Â À§ÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ÆÄÀÏÀ» Å×ÀÌºí¿¡´Ù Áý¾î³Ö´Â »ùÇÃÀÌ´Ù.
void insert_file(MYSQL* pMySQL, const char* name, const char* filename)
{
ifstream file(filename, ios::in | ios::binary);
if (!file) return;
file.seekg(0, ios::end);
size_t file_length = file.tellg();
file.seekg(0, ios::beg);
char* file_buffer = new char[file_length];
file.read(file_buffer, file_length);
size_t query_length = file_length * 2 + 200;
char* query_buffer = new char[query_length];
char* end = NULL;
strcpy(query_buffer, "INSERT INTO Files VALUES(");
end = &(query_buffer[strlen("INSERT INTO Files VALUES(")]);
*end++ = '\'';
end += convert_escape(end, name, strlen(name));
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += convert_escape(end, file_buffer, file_length);
*end++ = '\'';
*end++ = ')';
if (mysql_real_query(pMYSQL, query_buffer, (ulong)(end - query_buffer)))
{
assert(false);
}
delete [] file_buffer;
delete [] query_buffer;
}
3 °¡Á®¿À±â
°¡Á®¿Ã ¶§´Â mysql_fetch_row ÇÔ¼ö¿Í mysql_fetch_lengths ÇÔ¼ö¸¦ ÅëÇØ ¹öÆÛ¿Í ±× ±æÀ̸¦ ¾Ë¾Æ³½ ´ÙÀ½, ±×³É ¸Þ¸ð¸®¿¡ ÀÖ´Â ¹öÆÛ¸¦ ¾²µíÀÌ ¾²¸é µÈ´Ù. ³ª °°Àº °æ¿ì¿¡´Â ¸Þ¸ð¸®¸¦ ÆÄÀÏó·³ ÀÐÀ» ¼ö ÀÖ´Â ÆÄÀÏ Å¬·¡½º¸¦ »ý¼ºÇؼ ½è´Ù.
4 Âü°í
À§¿¡ ³ª¿ÍÀÖ´Â ¼Ò½º¸¦ ÀÌ¿ëÇØ, text to binary, binary to text º¯È¯ À¯Æ¿¸®Æ¼¸¦ ¸¸µé¾îº¸¾Ò´Ù. BLOB Ä÷³ °ü·ÃÇØ¼ ¼öµ¿À¸·Î SQL ¹®À» ¸¸µé ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù. tools.zip
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)