vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.
vsql_duckdb는 서버 프로세스 안에서 DuckDB를 실행하므로, SQL 문 하나로
객체 스토리지나 디스크에 있는 Parquet, CSV, JSON 파일을 바로 읽을 수 있습니다.
분석 파일은 있던 자리에 그대로 두고, 내보내기 단계나 운영해야 할 두 번째 엔진
없이 테이블 옆에서 쿼리합니다.
queries_total은 성공했든 오류를 냈든 실행된 duckdb_query() 또는
duckdb_scalar() 호출을 셉니다. 빈 결과나 NULL 값 때문에 NULL을 반환하는
duckdb_scalar() 호출은 성공으로 셉니다. sql 인수 자체가 NULL인 호출은
어느 카운터도 올리지 않고 NULL을 반환합니다. queries_failed는 오류를 낸
호출만 세며, queries_total에 포함됩니다.
CSV를 읽고 행을 JSON으로 받습니다. 서버 자체 디스크 읽기는 기본적으로 꺼져
있으므로 먼저 켭니다:
SET GLOBAL vsql_duckdb.allow_local_files = ON;SELECT duckdb_query( 'SELECT sku, units * unit_price AS total FROM read_csv_auto(''/path/to/sales.csv'') ORDER BY total DESC') AS rows_json\G
결과가 JSON이므로, JSON_TABLE로 다시 행으로 바꾸어 자신의 테이블과 조인할 수
있습니다.
allow_local_files는 서버 계정이 읽을 수 있는 모든 파일을 열며,
enable_external_access는 기본적으로 켜져 있어 쿼리가 네트워크에도 접근할 수
있습니다. 확장 기능의 함수는 저장 함수처럼 권한을 부여할 수 없으므로, 여기서
SQL을 실행할 수 있는 사람은 누구나 이 함수를 호출할 수 있습니다. 확장 기능을
설치하면 모든 계정이 두 스위치의 범위를 갖게 됩니다. 객체 스토리지 비밀 값은
키링에 있으며, vsql_duckdb.s3_secret_keyring_id는 그 이름만 가리킵니다.
SET PERSIST로 쓴 설정은 재시작 후에도 유지되지만, UNINSTALL EXTENSION이
이를 삭제합니다. 제거 후 다시 설치하면 모든 설정이 기본값으로 돌아가며, 재시작해도
이전 값은 돌아오지 않습니다.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"VillageSQL Server for MySQL - Documentation","description":"Documentation for VillageSQL, a drop-in replacement for MySQL that offers extensions.","colors":{"primary":"#9500BF","light":"#CC66FF","dark":"#1F062A"},"logo":{"light":"https://mintcdn.com/villagesql/ER5Fb1fv5K0c6u26/images/logo-light.svg?fit=max\u0026auto=format\u0026n=ER5Fb1fv5K0c6u26\u0026q=85\u0026s=984aeecbb83c7ff4d729220dc5b295ba","dark":"https://mintcdn.com/villagesql/ER5Fb1fv5K0c6u26/images/logo-dark.svg?fit=max\u0026auto=format\u0026n=ER5Fb1fv5K0c6u26\u0026q=85\u0026s=7c54878160d03b398facdce3c68e8f53","href":"https://villagesql.com"},"favicon":"https://mintcdn.com/villagesql/dJP528IM9EMOJWSW/images/favicon.png?fit=max\u0026auto=format\u0026n=dJP528IM9EMOJWSW\u0026q=85\u0026s=dcd56233103a4ed589abde42130b2a1d","background":{"color":{"dark":"#1F062A"}},"navbar":{"links":[{"icon":"github","href":"https://github.com/villagesql/villagesql-server","label":"GitHub"},{"icon":"discord","href":"https://discord.gg/KSr6whd3Fr","label":"Discord"}]},"footer":{"socials":{"github":"https://github.com/villagesql/villagesql-server","discord":"https://discord.gg/KSr6whd3Fr","linkedin":"https://www.linkedin.com/company/villagesql"}},"seo":{"metatags":{"og:type":"website","og:site_name":"VillageSQL Documentation"},"indexing":"all"},"fonts":{"heading":{"family":"Space Grotesk"}},"styling":{"eyebrows":"breadcrumbs","latex":true},"errors":{"404":{"redirect":false,"title":"This is not the village you are looking for (Error 404)","description":"It looks like you got lost looking for the village. Please go back to the [documentation site](https://villagesql.com/docs) to find what you need."}},"contextual":{"options":["copy","view","claude","chatgpt","perplexity","mcp","cursor","vscode"],"display":"header"},"navigation":{"languages":[{"language":"en","default":true,"href":""},{"language":"ja","href":"ja"},{"language":"ko","href":"ko"},{"language":"zh","href":"zh"},{"language":"pt-BR","href":"pt-BR"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"villagesql","hasAudioNarration":false,"actualSubdomain":"villagesql","customDomains":["villagesql.com"],"gitSource":{"type":"github","owner":"villagesql","repo":"villagesql-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aea5444cbdb6f4019023d8d","collectionId":"3738827d-e3a7-41ca-876b-f228a581f851","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aea5444cbdb6f4019023d8d"},"feedback":{"thumbs":true,"issues":true,"edits":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aed3be608f6d22a38fe9caa","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"en","tag":"Guides","count":142},{"language":"en","tag":"MySQL Tutorial","count":46},{"language":"en","tag":"Extensions","count":35},{"language":"ja","tag":"拡張機能","count":35},{"language":"ko","tag":"확장 기능","count":35},{"language":"pt-BR","tag":"Extensões","count":35},{"language":"zh","tag":"扩展","count":35},{"language":"en","tag":"Server","count":28},{"language":"en","tag":"Dev releases","count":28},{"language":"en","tag":"Extension Catalog","count":23},{"language":"en","tag":"Available Extensions","count":23},{"language":"ja","tag":"拡張機能カタログ","count":23},{"language":"ja","tag":"利用可能な拡張機能","count":23},{"language":"ko","tag":"확장 기능 카탈로그","count":23},{"language":"ko","tag":"사용 가능한 확장 기능","count":23},{"language":"pt-BR","tag":"Catálogo de Extensões","count":23},{"language":"pt-BR","tag":"Extensões Disponíveis","count":23},{"language":"zh","tag":"扩展目录","count":23},{"language":"zh","tag":"可用扩展","count":23},{"language":"en","tag":"Operate MySQL","count":21},{"language":"en","tag":"Write Queries","count":19},{"language":"en","tag":"Install and Run Server","count":16},{"language":"ja","tag":"C++ SDK","count":14},{"language":"ko","tag":"C++ SDK","count":14},{"language":"pt-BR","tag":"SDK C++","count":14},{"language":"zh","tag":"C++ SDK","count":14},{"language":"ja","tag":"サーバー","count":13},{"language":"ko","tag":"서버","count":13},{"language":"pt-BR","tag":"Servidor","count":13},{"language":"zh","tag":"服务器","count":13},{"language":"ja","tag":"リファレンス","count":11},{"language":"ko","tag":"참조","count":11},{"language":"pt-BR","tag":"Referência","count":11},{"language":"zh","tag":"参考","count":11},{"language":"ja","tag":"サーバーのインストールと実行","count":9},{"language":"ja","tag":"拡張機能の作成","count":9},{"language":"ko","tag":"서버 설치 및 실행","count":9},{"language":"ko","tag":"확장 기능 빌드","count":9},{"language":"pt-BR","tag":"Instalar e Executar o Servidor","count":9},{"language":"pt-BR","tag":"Criar uma Extensão","count":9},{"language":"zh","tag":"安装和运行服务器","count":9},{"language":"zh","tag":"构建扩展","count":9},{"language":"ja","tag":"Rust SDK","count":8},{"language":"ko","tag":"Rust SDK","count":8},{"language":"pt-BR","tag":"SDK Rust","count":8},{"language":"zh","tag":"Rust SDK","count":8},{"language":"ja","tag":"MySQL 8.4","count":5},{"language":"ko","tag":"MySQL 8.4","count":5},{"language":"pt-BR","tag":"MySQL 8.4","count":5},{"language":"zh","tag":"MySQL 8.4","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"help@villagesql.com","showHelpButton":true}},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":".nav-dropdown-products-selector-trigger{order:1!important}.hidden.lg\\:flex.items-center.gap-x-2{order:2!important}#navbar,#sidebar,#mobile-nav,#table-of-contents{font-family:var(--font-family-headings-custom)}body{font-family:Arial, sans-serif}button.nav-tabs-item>div.font-medium{color:rgb(var(--gray-800))}html.dark button.nav-tabs-item>div.font-medium{color:rgb(var(--gray-200))}img.nav-logo{height:2.5rem!important;width:auto!important}img[src$=\"/images/pelican.svg\"]{width:1.5rem!important;height:1.5rem!important;margin:-0.25rem}@media (min-width: 1024px){li.navbar-link>a{font-size:0;gap:0;padding:0.5rem}li.navbar-link>a svg{height:1.25rem;width:1.25rem}}[data-callout-type=\"tip\"],[data-callout-type=\"note\"],[data-callout-type=\"info\"]{border-color:#CC66FF!important;background-color:rgb(204 102 255 / 0.08)!important}[data-callout-type=\"warning\"]{border:2px solid #B500BA!important;background-color:#FFFFFF!important}[data-callout-type] [data-component-part=\"callout-content\"]{color:#1F062A!important}[data-callout-type] [data-component-part=\"callout-icon\"] svg{color:#9500BF!important}[data-callout-type=\"warning\"] [data-component-part=\"callout-icon\"] svg{color:#630080!important}html.dark [data-callout-type=\"tip\"],html.dark [data-callout-type=\"note\"],html.dark [data-callout-type=\"info\"]{border-color:#630080!important;background-color:rgb(204 102 255 / 0.08)!important}html.dark [data-callout-type=\"warning\"]{border-color:#B500BA!important;background-color:transparent!important}html.dark [data-callout-type] [data-component-part=\"callout-content\"]{color:#FFFFFF!important}html.dark [data-callout-type] [data-component-part=\"callout-icon\"] svg{color:#CC66FF!important}.agent-setup #ask-assistant-code-block-button{display:none}html.dark .code-block [class*=\"dark:bg-codeblock\"]{background-color:#1F062A!important}html.dark .code-block [class=\"print:hidden\"]{background-image:linear-gradient(to right, rgb(31 6 42 / 0) 0px, rgb(31 6 42 / 0.2) 10px,\n rgb(31 6 42 / 0.5) 25px, rgb(31 6 42 / 0.8) 35px, rgb(31 6 42) 45px)!important}.chat-assistant-floating-input{display:none!important}"}],"page":{"pagePath":"ko/extensions/vsql-duckdb","slug":"/ko/extensions/vsql-duckdb","pageMetadata":{"title":"MySQL용 vsql_duckdb 확장 기능","sidebarTitle":"vsql_duckdb","description":"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.","keywords":"mysql duckdb, mysql에서 parquet 쿼리, mysql s3 csv 읽기, mysql 분석 파일, vsql_duckdb","audience":"villagesql-user","href":"/ko/extensions/vsql-duckdb"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`vsql_duckdb`}),`는 서버 프로세스 안에서 DuckDB를 실행하므로, SQL 문 하나로\n객체 스토리지나 디스크에 있는 Parquet, CSV, JSON 파일을 바로 읽을 수 있습니다.\n분석 파일은 있던 자리에 그대로 두고, 내보내기 단계나 운영해야 할 두 번째 엔진\n없이 테이블 옆에서 쿼리합니다.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`관리자`})}),_jsx(_components.td,{children:`VillageSQL`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`소스 및 전체 문서`})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://github.com/villagesql/vsql-duckdb`,children:`villagesql/vsql-duckdb`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`라이선스`})}),_jsx(_components.td,{children:`GPL-2.0`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`기능 단계`})}),_jsx(_components.td,{children:`미리 보기`})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`이 확장 기능은 미리 보기 기능 세 가지를 선언하므로, 서버를\n`,_jsx(_components.code,{children:`--vsql_allow_preview_extensions=ON`}),`으로 시작해야 합니다. 또한 0.0.6보다 새로운\nVillageSQL 서버가 필요합니다.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`install`,children:`설치`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`vsql_duckdb`}),`는 서버와 함께 번들로 제공되지 않으므로, 먼저 저장소에서 빌드한\n다음 생성된 `,_jsx(_components.code,{children:`vsql_duckdb.veb`}),`를 `,_jsx(_components.code,{children:`veb_dir`}),` 시스템 변수가 가리키는 디렉터리에\n복사하세요. 그런 다음 설치합니다:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`INSTALL EXTENSION vsql_duckdb;`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`설치되었는지 확인합니다:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` EXTENSION_NAME`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`FROM`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` INFORMATION_SCHEMA`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`EXTENSIONS`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`WHERE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` EXTENSION_NAME `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'vsql_duckdb'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{numberOfLines:`6`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+----------------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| EXTENSION_NAME |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+----------------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| vsql_duckdb |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+----------------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`빌드 지침은 `,_jsx(_components.a,{href:`https://github.com/villagesql/vsql-duckdb`,children:`저장소`}),`에 있습니다.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-adds`,children:`추가되는 기능`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`함수`}),_jsx(_components.th,{children:`반환값`}),_jsx(_components.th,{children:`설명`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`duckdb_query(sql)`})}),_jsx(_components.td,{children:`text`}),_jsx(_components.td,{children:`DuckDB 쿼리를 실행하고 행을 JSON 배열로 반환`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`duckdb_scalar(sql)`})}),_jsx(_components.td,{children:`text`}),_jsx(_components.td,{children:`DuckDB 쿼리를 실행하고 첫 번째 행의 첫 번째 값을 반환`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`duckdb_status()`})}),_jsx(_components.td,{children:`text`}),_jsx(_components.td,{children:`DuckDB 버전, 링크된 리더, 현재 설정을 보고`})]})]})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`설정`}),_jsx(_components.th,{children:`기본값`}),_jsx(_components.th,{children:`제어 대상`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_duckdb.allow_local_files`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`OFF`})}),_jsx(_components.td,{children:`쿼리가 서버 자체 디스크의 파일을 읽을 수 있는지 여부`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_duckdb.enable_external_access`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ON`})}),_jsx(_components.td,{children:`쿼리가 네트워크에 접근할 수 있는지 여부`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`vsql_duckdb.s3_endpoint`}),`, `,_jsx(_components.code,{children:`vsql_duckdb.s3_region`}),`, `,_jsx(_components.code,{children:`vsql_duckdb.s3_url_style`}),`, `,_jsx(_components.code,{children:`vsql_duckdb.s3_use_ssl`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`duckdb_status()`}),` 참조`]}),_jsx(_components.td,{children:`객체 스토리지의 위치와 주소 지정 방식`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`vsql_duckdb.s3_key_id`}),`, `,_jsx(_components.code,{children:`vsql_duckdb.s3_secret_keyring_id`}),`, `,_jsx(_components.code,{children:`vsql_duckdb.s3_secret_keyring_auth_id`})]}),_jsx(_components.td,{children:`비어 있음`}),_jsx(_components.td,{children:`객체 스토리지 자격 증명. 비밀 값은 키링에 보관`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_duckdb.memory_limit_mb`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1024`})}),_jsx(_components.td,{children:`내장 엔진의 메모리 상한`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_duckdb.threads`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`2`})}),_jsx(_components.td,{children:`사용할 수 있는 스레드 수`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_duckdb.timeout_ms`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`30000`})}),_jsx(_components.td,{children:`쿼리 하나가 실행될 수 있는 시간`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_duckdb.max_result_bytes`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1048576`})}),_jsx(_components.td,{children:`반환되는 결과의 크기 상한`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_duckdb.temp_directory`})}),_jsx(_components.td,{children:`비어 있음`}),_jsxs(_components.td,{children:[`쿼리가 메모리를 초과할 때 디스크로 내보내는 위치. `,_jsx(_components.code,{children:`allow_local_files`}),`가 켜져 있을 때만 발생`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`SHOW STATUS LIKE 'vsql_duckdb%'`}),`는 카운터 두 개를 보고하며, 이 값은 서버\n프로세스가 살아 있는 동안 유지됩니다:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`7`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+----------------------------+-------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| Variable_name | Value |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+----------------------------+-------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| vsql_duckdb.queries_failed | 0 |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| vsql_duckdb.queries_total | 0 |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+----------------------------+-------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`queries_total`}),`은 성공했든 오류를 냈든 실행된 `,_jsx(_components.code,{children:`duckdb_query()`}),` 또는\n`,_jsx(_components.code,{children:`duckdb_scalar()`}),` 호출을 셉니다. 빈 결과나 NULL 값 때문에 `,_jsx(_components.code,{children:`NULL`}),`을 반환하는\n`,_jsx(_components.code,{children:`duckdb_scalar()`}),` 호출은 성공으로 셉니다. `,_jsx(_components.code,{children:`sql`}),` 인수 자체가 `,_jsx(_components.code,{children:`NULL`}),`인 호출은\n어느 카운터도 올리지 않고 `,_jsx(_components.code,{children:`NULL`}),`을 반환합니다. `,_jsx(_components.code,{children:`queries_failed`}),`는 오류를 낸\n호출만 세며, `,_jsx(_components.code,{children:`queries_total`}),`에 포함됩니다.`]}),`\n`,_jsx(Heading,{level:`2`,id:`example`,children:`예제`}),`\n`,_jsx(_components.p,{children:`확장 기능의 상태를 물어봅니다:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` duckdb_status() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`AS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` status`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\\\\G`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{numberOfLines:`18`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`18`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`*************************** 1. row ***************************`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`status: {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"duckdb_version\": \"v1.5.5\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"readers\": [\"core_functions\", \"httpfs\", \"json\", \"parquet\"],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"engine_error\": \"\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"object_storage_credential\": \"not configured\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"s3_endpoint\": \"\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"s3_region\": \"\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"s3_url_style\": \"vhost\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"s3_use_ssl\": true,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"enable_external_access\": true,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"allow_local_files\": false,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"memory_limit_mb\": 1024,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"threads\": 2,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"timeout_ms\": 30000,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"max_result_bytes\": 1048576`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`파일을 건드리지 않는 쿼리를 실행합니다:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` duckdb_scalar(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'SELECT 6 * 7'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`AS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` answer;`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{numberOfLines:`6`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+--------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| answer |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+--------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| 42 |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+--------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`CSV를 읽고 행을 JSON으로 받습니다. 서버 자체 디스크 읽기는 기본적으로 꺼져\n있으므로 먼저 켭니다:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SET`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` GLOBAL`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` vsql_duckdb`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`allow_local_files`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` duckdb_query(`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'SELECT sku, units * unit_price AS total`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` FROM read_csv_auto(''/path/to/sales.csv'')`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ORDER BY total DESC'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`AS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` rows_json\\\\G`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`*************************** 1. row ***************************`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`rows_json: [{\"sku\":\"A-100\",\"total\":59.97},{\"sku\":\"A-101\",\"total\":24.5},{\"sku\":\"A-102\",\"total\":21.7}]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`작업이 끝나면 다시 끄세요. 끄기 전까지는 계속 켜져 있습니다:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SET`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` GLOBAL`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` vsql_duckdb`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`allow_local_files`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` OFF`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`결과가 JSON이므로, `,_jsx(_components.code,{children:`JSON_TABLE`}),`로 다시 행으로 바꾸어 자신의 테이블과 조인할 수\n있습니다.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`allow_local_files`}),`는 서버 계정이 읽을 수 있는 모든 파일을 열며,\n`,_jsx(_components.code,{children:`enable_external_access`}),`는 기본적으로 켜져 있어 쿼리가 네트워크에도 접근할 수\n있습니다. 확장 기능의 함수는 저장 함수처럼 권한을 부여할 수 없으므로, 여기서\nSQL을 실행할 수 있는 사람은 누구나 이 함수를 호출할 수 있습니다. 확장 기능을\n설치하면 모든 계정이 두 스위치의 범위를 갖게 됩니다. 객체 스토리지 비밀 값은\n키링에 있으며, `,_jsx(_components.code,{children:`vsql_duckdb.s3_secret_keyring_id`}),`는 그 이름만 가리킵니다.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`SET PERSIST`}),`로 쓴 설정은 재시작 후에도 유지되지만, `,_jsx(_components.code,{children:`UNINSTALL EXTENSION`}),`이\n이를 삭제합니다. 제거 후 다시 설치하면 모든 설정이 기본값으로 돌아가며, 재시작해도\n이전 값은 돌아오지 않습니다.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`see-also`,children:`참고 항목`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ko/extensions/managing`,children:`확장 기능 관리`}),` — 확장 기능 설정을 읽고 쓰는 방법`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ko/extensions/build/preview-capabilities`,children:`미리 보기 기능`}),` — 미리 보기 플래그가 켜는 것과 보장하는 것`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ko/extensions/catalog`,children:`사용 가능한 확장 기능`}),` — 전체 카탈로그`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://github.com/villagesql/vsql-duckdb`,children:`villagesql/vsql-duckdb`}),` — 소스, 빌드 지침, 알려진 제한 사항`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"MySQL용 vsql_duckdb 확장 기능","sidebarTitle":"vsql_duckdb","description":"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.","keywords":"mysql duckdb, mysql에서 parquet 쿼리, mysql s3 csv 읽기, mysql 분석 파일, vsql_duckdb","audience":"villagesql-user","href":"/ko/extensions/vsql-duckdb"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"설치","slug":"install","depth":2,"children":[]},{"title":"추가되는 기능","slug":"what-it-adds","depth":2,"children":[]},{"title":"예제","slug":"example","depth":2,"children":[]},{"title":"참고 항목","slug":"see-also","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/villagesql/2202b5e0d18501d7/consent-loader.js"],"subdomain":"villagesql","siteName":"VillageSQL Server for MySQL - Documentation","title":"MySQL용 vsql_duckdb 확장 기능 - VillageSQL Server for MySQL - Documentation","contextualStarterQuestions":[{"_id":"6aed3c240975dbe7e5eaf4fe","deploymentId":"690e4c8e612a67c5b7e46992","questionText":"Which functions does it provide?","status":"active","generatedBy":"contextual","path":"ko/extensions/vsql-duckdb","createdAt":"2026-11-06T02:32:04.239Z","updatedAt":"2026-11-06T02:32:04.239Z","__v":0},{"_id":"6aed3c240975dbe7e5eaf4fd","deploymentId":"690e4c8e612a67c5b7e46992","questionText":"What files can vsql_duckdb read?","status":"active","generatedBy":"contextual","path":"ko/extensions/vsql-duckdb","createdAt":"2026-11-06T02:32:04.239Z","updatedAt":"2026-11-06T02:32:04.239Z","__v":0},{"_id":"6aed3c240975dbe7e5eaf4fc","deploymentId":"690e4c8e612a67c5b7e46992","questionText":"How do I install vsql_duckdb?","status":"active","generatedBy":"contextual","path":"ko/extensions/vsql-duckdb","createdAt":"2026-11-06T02:32:04.239Z","updatedAt":"2026-11-06T02:32:04.239Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/extensions/vsql-duckdb","matchLevel":1},"ja":{"href":"/ja/extensions/vsql-duckdb","matchLevel":1},"ko":{"href":"/ko/extensions/vsql-duckdb","matchLevel":0},"zh":{"href":"/zh/extensions/vsql-duckdb","matchLevel":1},"pt-BR":{"href":"/pt-BR/extensions/vsql-duckdb","matchLevel":1}}},"lastModified":"2026-11-06T02:31:22.491Z","originalFileLocation":"ko/extensions/vsql-duckdb.mdx","locale":"ko"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.\">\u003cmeta data-mint-head name=\"application-name\" content=\"VillageSQL Server for MySQL - Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"MySQL용 vsql_duckdb 확장 기능 - VillageSQL Server for MySQL - Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"VillageSQL Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://villagesql.com/docs/ko/extensions/vsql-duckdb\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://villagesql.mintlify.site/docs/_mintlify/api/og/v2?division=%EC%82%AC%EC%9A%A9+%EA%B0%80%EB%8A%A5%ED%95%9C+%ED%99%95%EC%9E%A5+%EA%B8%B0%EB%8A%A5\u0026amp;title=MySQL%EC%9A%A9+vsql_duckdb+%ED%99%95%EC%9E%A5+%EA%B8%B0%EB%8A%A5\u0026amp;description=vsql_duckdb+%ED%99%95%EC%9E%A5+%EA%B8%B0%EB%8A%A5%EC%9D%80+MySQL+%EC%95%88%EC%97%90%EC%84%9C+DuckDB%EB%A5%BC+%EC%8B%A4%ED%96%89%ED%95%98%EB%AF%80%EB%A1%9C%2C+%EC%BF%BC%EB%A6%AC%EA%B0%80+%EA%B0%9D%EC%B2%B4+%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80%EB%82%98+%EB%94%94%EC%8A%A4%ED%81%AC%EC%9D%98+Parquet%2C+CSV%2C+JSON+%ED%8C%8C%EC%9D%BC%EC%9D%84+%EC%9D%BD%EA%B3%A0+%ED%96%89%EC%9D%84+JSON%EC%9C%BC%EB%A1%9C+%EB%B0%98%ED%99%98%ED%95%A0+%EC%88%98+%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.\u0026amp;theme=88e90f7620ba1dac07c284b1\u0026amp;signature=9d8212f7f800623a0ade3a62e7d034699191b1d547b97296937c49a4c72f5e5b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"MySQL용 vsql_duckdb 확장 기능 - VillageSQL Server for MySQL - Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://villagesql.mintlify.site/docs/_mintlify/api/og/v2?division=%EC%82%AC%EC%9A%A9+%EA%B0%80%EB%8A%A5%ED%95%9C+%ED%99%95%EC%9E%A5+%EA%B8%B0%EB%8A%A5\u0026amp;title=MySQL%EC%9A%A9+vsql_duckdb+%ED%99%95%EC%9E%A5+%EA%B8%B0%EB%8A%A5\u0026amp;description=vsql_duckdb+%ED%99%95%EC%9E%A5+%EA%B8%B0%EB%8A%A5%EC%9D%80+MySQL+%EC%95%88%EC%97%90%EC%84%9C+DuckDB%EB%A5%BC+%EC%8B%A4%ED%96%89%ED%95%98%EB%AF%80%EB%A1%9C%2C+%EC%BF%BC%EB%A6%AC%EA%B0%80+%EA%B0%9D%EC%B2%B4+%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80%EB%82%98+%EB%94%94%EC%8A%A4%ED%81%AC%EC%9D%98+Parquet%2C+CSV%2C+JSON+%ED%8C%8C%EC%9D%BC%EC%9D%84+%EC%9D%BD%EA%B3%A0+%ED%96%89%EC%9D%84+JSON%EC%9C%BC%EB%A1%9C+%EB%B0%98%ED%99%98%ED%95%A0+%EC%88%98+%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.\u0026amp;theme=88e90f7620ba1dac07c284b1\u0026amp;signature=9d8212f7f800623a0ade3a62e7d034699191b1d547b97296937c49a4c72f5e5b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/villagesql/LyGu9hbDVoyQmlU_/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"VillageSQL Server for MySQL - Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#9500BF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://villagesql.com/docs/ko/extensions/vsql-duckdb\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/ko/extensions/vsql-duckdb.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://villagesql.com/docs/ko/extensions/vsql-duckdb\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://villagesql.com/docs/en/extensions/vsql-duckdb\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://villagesql.com/docs/ja/extensions/vsql-duckdb\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://villagesql.com/docs/zh/extensions/vsql-duckdb\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt-BR\" href=\"https://villagesql.com/docs/pt-BR/extensions/vsql-duckdb\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://villagesql.com/docs/en/extensions/vsql-duckdb\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://villagesql.com/#organization\",\"name\":\"VillageSQL Server for MySQL - Documentation\",\"url\":\"https://villagesql.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/villagesql/ER5Fb1fv5K0c6u26/images/logo-light.svg?fit=max\u0026auto=format\u0026n=ER5Fb1fv5K0c6u26\u0026q=85\u0026s=984aeecbb83c7ff4d729220dc5b295ba\"}},{\"@type\":\"WebSite\",\"@id\":\"https://villagesql.com/docs#website\",\"name\":\"VillageSQL Server for MySQL - Documentation\",\"url\":\"https://villagesql.com/docs\",\"publisher\":{\"@id\":\"https://villagesql.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb#webpage\",\"url\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb\",\"name\":\"MySQL용 vsql_duckdb 확장 기능\",\"description\":\"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.\",\"dateModified\":\"2026-11-06T02:31:22.491Z\",\"isPartOf\":{\"@id\":\"https://villagesql.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"확장 기능 카탈로그\",\"item\":\"https://villagesql.com/docs/ko/extensions/vsql-ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"사용 가능한 확장 기능\",\"item\":\"https://villagesql.com/docs/ko/extensions/catalog\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"MySQL용 vsql_duckdb 확장 기능\",\"item\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb#article\",\"headline\":\"MySQL용 vsql_duckdb 확장 기능\",\"name\":\"MySQL용 vsql_duckdb 확장 기능\",\"description\":\"vsql_duckdb 확장 기능은 MySQL 안에서 DuckDB를 실행하므로, 쿼리가 객체 스토리지나 디스크의 Parquet, CSV, JSON 파일을 읽고 행을 JSON으로 반환할 수 있습니다.\",\"url\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb\",\"mainEntityOfPage\":{\"@id\":\"https://villagesql.com/docs/ko/extensions/vsql-duckdb#webpage\"},\"dateModified\":\"2026-11-06T02:31:22.491Z\",\"publisher\":{\"@id\":\"https://villagesql.com/#organization\"},\"isPartOf\":{\"@id\":\"https://villagesql.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"VillageSQL Server for MySQL - Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"VillageSQL Server for MySQL - Documentation","nav":{"global":null,"languages":[{"language":"en","default":true,"pages":[{"title":"en","href":"/en/extensions/vsql-duckdb"}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/extensions/vsql-duckdb"}]},{"language":"ko","tabs":[{"tab":"개요","pages":[{"title":"개요","href":"/ko"}]},{"tab":"확장 기능","groups":[{"group":"확장 기능 설치 및 실행","pages":[{"title":"확장 설치","href":"/ko/extensions/install"},{"title":"확장 프로그램 제거","href":"/ko/extensions/uninstall"},{"title":"확장 관리","href":"/ko/extensions/managing"}]},{"group":"확장 기능 카탈로그","pages":[{"group":"사용 가능한 확장 기능","root":{"title":"사용 가능한 확장 기능","href":"/ko/extensions/catalog"},"expanded":false,"pages":[{"title":"MySQL용 vsql_ai 확장 기능","sidebarTitle":"vsql_ai","href":"/ko/extensions/vsql-ai"},{"title":"MySQL용 vsql_boolean 확장 기능","sidebarTitle":"vsql_boolean","href":"/ko/extensions/vsql-boolean"},{"title":"MySQL용 vsql_crypto 확장 기능","sidebarTitle":"vsql_crypto","href":"/ko/extensions/vsql-crypto"},{"title":"MySQL용 vsql_cube 확장 기능","sidebarTitle":"vsql_cube","href":"/ko/extensions/vsql-cube"},{"title":"MySQL용 vsql_currency 확장 기능","sidebarTitle":"vsql_currency","description":"vsql_currency 확장 기능은 164개의 ISO 4217 코드 중 하나를 1바이트에 담고 입력 시 대소문자를 구분하지 않는 currency 열 유형을 MySQL에 추가합니다.","href":"/ko/extensions/vsql-currency"},{"title":"MySQL용 vsql_duckdb 확장 기능","sidebarTitle":"vsql_duckdb","href":"/ko/extensions/vsql-duckdb"},{"title":"MySQL용 vsql_fuzzystrmatch 확장 기능","sidebarTitle":"vsql_fuzzystrmatch","description":"vsql_fuzzystrmatch 확장 기능은 이름 매칭과 중복 제거를 위해 Soundex, Metaphone, Double Metaphone, Levenshtein 편집 거리를 MySQL에 추가합니다.","href":"/ko/extensions/vsql-fuzzystrmatch"},{"title":"MySQL용 vsql_http 확장 기능","sidebarTitle":"vsql_http","href":"/ko/extensions/vsql-http"},{"title":"MySQL용 vsql_mcp 확장 기능","sidebarTitle":"vsql_mcp","href":"/ko/extensions/vsql-mcp"},{"title":"MySQL용 vsql_network_address 확장 기능","sidebarTitle":"vsql_network_address","href":"/ko/extensions/vsql-network-address"},{"title":"MySQL용 vsql_oauth2 확장 기능","sidebarTitle":"vsql_oauth2","href":"/ko/extensions/vsql-oauth2"},{"title":"MySQL용 vsql_rest 확장 기능","sidebarTitle":"vsql_rest","href":"/ko/extensions/vsql-rest"},{"title":"MySQL용 vsql_stat_ch 확장 기능","sidebarTitle":"vsql_stat_ch","href":"/ko/extensions/vsql-stat-ch"},{"title":"MySQL용 vsql_trgm 확장 기능","sidebarTitle":"vsql_trgm","href":"/ko/extensions/vsql-trgm"},{"title":"MySQL용 vsql_uuid 확장 기능","sidebarTitle":"vsql_uuid","href":"/ko/extensions/vsql-uuid"},{"title":"MySQL용 prometheus_exporter 확장 기능","sidebarTitle":"prometheus_exporter","href":"/ko/extensions/prometheus-exporter"},{"title":"MySQL용 vsql_address_standardizer 확장 기능","sidebarTitle":"vsql_address_standardizer","href":"/ko/extensions/vsql-address-standardizer"},{"title":"MySQL용 vsql_luhn 확장 기능","sidebarTitle":"vsql_luhn","href":"/ko/extensions/vsql-luhn"},{"title":"MySQL용 vsql_nanoid 확장 기능","sidebarTitle":"vsql_nanoid","href":"/ko/extensions/vsql-nanoid"},{"title":"MySQL용 vsql_pgjwt 확장 기능","sidebarTitle":"vsql_pgjwt","href":"/ko/extensions/vsql-pgjwt"},{"title":"MySQL용 vsql_slugify 확장 기능","sidebarTitle":"vsql_slugify","href":"/ko/extensions/vsql-slugify"},{"title":"MySQL용 vsql_statistics 확장 기능","sidebarTitle":"vsql_statistics","href":"/ko/extensions/vsql-statistics"},{"title":"MySQL용 vsql_complex 확장 기능","sidebarTitle":"vsql_complex","href":"/ko/extensions/vsql-complex"}]}]},{"group":"확장 기능 빌드","pages":[{"title":"C++로 확장 만들기","href":"/ko/extensions/build/create"},{"title":"Rust로 확장 만들기","href":"/ko/extensions/build/rust-sdk"},{"title":"확장 프로그램 또는 플러그인 및 컴포넌트","href":"/ko/extensions/build/extensions-or-plugins"},{"title":"확장 아키텍처","href":"/ko/extensions/build/architecture"},{"title":"확장과 ABI의 동작 방식","href":"/ko/extensions/build/extension-abi-behavior"},{"group":"고급 주제","expanded":false,"pages":[{"title":"미리보기 기능","href":"/ko/extensions/build/preview-capabilities"},{"title":"사용자 정의 인덱스","href":"/ko/extensions/build/custom-indexes"},{"title":"PostgreSQL과 비교한 VEF 커버리지","href":"/ko/extensions/build/postgresql-hooks"},{"title":"프로토콜 1 API","href":"/ko/extensions/build/protocol-1"}]}]}]},{"tab":"서버","menu":[{"item":"MySQL 8.4","icon":"database","pages":[{"title":"MySQL 8.4","href":"/ko/8.4/stable/introduction"}]},{"item":"Percona Server 8.4","icon":"database","pages":[{"title":"Percona Server 8.4","href":"/ko/8.4/stable/percona"}]},{"item":"MySQL 9.7","icon":"database","pages":[{"title":"MySQL 9.7","href":"/ko/9.7/stable/introduction"}]},{"item":"이전 릴리스","icon":"clock-rotate-left","pages":[{"title":"이전 릴리스","href":"/ko/8.4/0.0.6"}]}],"pages":[{"title":"서버","href":"/ko/8.4/stable/introduction"}]},{"tab":"참조","menu":[{"item":"C++ SDK","icon":"code","pages":[{"title":"C++ SDK","href":"/ko/sdk/cpp/extension-api-reference"}]},{"item":"Rust SDK","icon":"rust","pages":[{"title":"Rust SDK","href":"/ko/sdk/rust/api-reference"}]}],"pages":[{"title":"참조","href":"/ko/sdk/cpp/extension-api-reference"}]},{"tab":"리소스","menu":[{"item":"villagesql.com","icon":"https://mintlify.s3.us-west-1.amazonaws.com/villagesql/images/pelican.svg","href":"https://villagesql.com"},{"item":"GitHub","icon":"github","href":"https://github.com/villagesql/villagesql-server"},{"item":"이슈","icon":"bug","href":"https://github.com/villagesql/villagesql-server/issues"},{"item":"Discord","icon":"discord","href":"https://discord.gg/KSr6whd3Fr"},{"item":"블로그","icon":"newspaper","href":"https://villagesql.com/blog"},{"item":"서버에 기여","icon":"code-pull-request","href":"https://github.com/villagesql/villagesql-server/blob/main/CONTRIBUTING.md"},{"item":"문서에 기여","icon":"pen-nib","href":"https://github.com/villagesql/villagesql-docs/blob/main/CONTRIBUTING.md"}]}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/extensions/vsql-duckdb"}]},{"language":"pt-BR","pages":[{"title":"pt-BR","href":"/pt-BR/extensions/vsql-duckdb"}]}]},"basePath":"","title":"MySQL용 vsql_duckdb 확장 기능 - VillageSQL Server for MySQL - Documentation","buildId":"dpl_CEsowfH15TDzsBT2BFbX312Be4Ct","deploymentId":"dpl_CEsowfH15TDzsBT2BFbX312Be4Ct","dynamics":[],"chunks":[]}