mysql c api에서 select field1... strlen(field1) 문제...

yangsg의 이미지

mysql c api를 이용해 플그램을 짜고 있습니다..

디비에 field1의 값이 NULL입니다..

query = select field1 from ...
result = mysql_store_result
row = mysql_fetch_row( result )

이럴경우 strlen(row[0]) 이렇게 할경우 return이 0이 될것을 기대했습니다..
그런데... segmentation fault가 발생합니다..

field1의 default 값이 빈공간일경우 0을 return하더군요..

흠... row[0] 이 변수가 NULL 인지 체크를 하고 strlen 함수를 사용해야 하는건가요 .. ??

yangsg의 이미지

그냥... row[0]이 NULL인지 검사하는 패턴을 넣었습니다..
row[0]?strlen(row[0]):0
그런데.. NULL일 경우 왜 0을 return 하지 않는지 의문이 남습니다...

yoocj9의 이미지

strlen(NULL);
이 Segmentation fault를 낼까요? 안낼까요?

mysql api와는 별로 상관이 없을 듯한데요...

yangsg의 이미지

strlen(NULL)은 segmentation fault 내던데요.. ;;

char a='\0'
strlen(a)은 0을 return 하더군요.. ;;

흠... 무식이 죄라고.. 무슨 차이가 있나요.. ??

kihongss의 이미지

shrrot wrote:
strlen(NULL)은 segmentation fault 내던데요.. ;;

char a='\0'
strlen(a)은 0을 return 하더군요.. ;;

흠... 무식이 죄라고.. 무슨 차이가 있나요.. ??

제 gcc에서는 둘다 segmentation fault를 내뱉네요.

[kihongss@w-102 test]$ gcc --version
2.96

yangsg의 이미지

char a='\0'; <-- 요거일경우는
strlen(&a) 해야 되는데 오타가 있네요..

[root@localhost project]# gcc --version
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

version이 상관이 있나요 ??
progcom의 이미지

글 흐름이 조금 이상하게 간 듯 싶은데... ;;
NULL과 '' (empty string)은 전혀 다른 존재입니다.

http://dev.mysql.com/doc/mysql/en/mysql-fetch-row.html

Quote:

The lengths of the field values in the row may be obtained by calling mysql_fetch_lengths(). Empty fields and fields containing NULL both have length 0; you can distinguish these by checking the pointer for the field value. If the pointer is NULL, the field is NULL; otherwise, the field is empty.

NULL 필드에 대해서 포인터를 확인하라고 되어있습니다. DB 필드값이 NULL이면 포인터가 NULL이고, 빈 문자열이면 포인터가 "" (== '\0')을 가리키는 것이지요.

NULL 필드에 대한 strlen(row[0]) == strlen(NULL) 이라서 segfault가 발생하게 되는 것이고, 매뉴얼의 예제쪽에는 mysql_fetch_lengths()를 사용하여 필드의 길이를 가져오는군요. (MYSQL_ROW 구조체가 필드값의 길이를 가지고 있기 때문에, 따로 strlen을 실행할 필요는 없다고 합니다)

yangsg의 이미지

아하.. progcom님 답변 감사드립니다..
딱 원하는 답변입니다..
reference를 펼쳐놓고 있으면서도 읽어 보지를 못했네요..

NULL, empty string에 대해서도 답변 감사드립니다..
무식이 글 읽고 아~ 도 트이는 소리가 ^^;

다시한번 감사드립니다..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.