The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.
vsql_fuzzystrmatch is a port of PostgreSQL’s fuzzystrmatch extension. It
answers two different questions about a pair of strings: do they sound alike,
and how many edits separate them. Use it for name matching, spelling
correction, and deduplicating records that were typed by hand.
vsql_fuzzystrmatch.veb is already in the server’s lib/veb/ directory if you
installed VillageSQL with the install script, the Docker image, or a release
tarball. Install it into the server with one statement:
MySQL has a SOUNDEX() of its own, and the built-in wins when you write the
name unqualified. The two disagree: SOUNDEX('Ashcraft') returns A2613,
while vsql_fuzzystrmatch.soundex('Ashcraft') returns A261. MySQL’s
version is documented as returning a string of any length, and the
extension’s follows the four-character Soundex definition. Qualify the call
with the extension name to get the one you mean. No other function here is
shadowed.
levenshtein_less_equal stops as soon as the true distance passes the limit
you give it, and then returns the limit plus 1, whatever the true distance
is. With a limit of 2 it returns 3 for a pair 3 apart and 3 for a pair 7
apart. Read the limit plus 1 as “further apart than you asked about”.
{"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":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"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":"en/extensions/vsql-fuzzystrmatch","slug":"/en/extensions/vsql-fuzzystrmatch","pageMetadata":{"title":"vsql_fuzzystrmatch extension for MySQL","sidebarTitle":"vsql_fuzzystrmatch","description":"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.","keywords":"mysql soundex, mysql levenshtein, mysql metaphone, mysql fuzzy name matching, vsql_fuzzystrmatch","audience":"villagesql-user","href":"/en/extensions/vsql-fuzzystrmatch"},"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: \"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.\"\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_fuzzystrmatch`}),` is a port of PostgreSQL’s `,_jsx(_components.code,{children:`fuzzystrmatch`}),` extension. It\nanswers two different questions about a pair of strings: do they sound alike,\nand how many edits separate them. Use it for name matching, spelling\ncorrection, and deduplicating records that were typed by hand.`]}),`\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:`Maintainer`})}),_jsx(_components.td,{children:`VillageSQL`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Source and full documentation`})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://github.com/villagesql/vsql-fuzzystrmatch`,children:`villagesql/vsql-fuzzystrmatch`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`License`})}),_jsx(_components.td,{children:`GPL-2.0`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`install`,children:`Install`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`vsql_fuzzystrmatch.veb`}),` is already in the server’s `,_jsx(_components.code,{children:`lib/veb/`}),` directory if you\ninstalled VillageSQL with the install script, the Docker image, or a release\ntarball. Install it into the server with one statement:`]}),`\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_fuzzystrmatch;`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Confirm it is there:`}),`\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_fuzzystrmatch'`}),_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_fuzzystrmatch |`})}),`\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:[`To build it yourself, follow the build instructions in the\n`,_jsx(_components.a,{href:`https://github.com/villagesql/vsql-fuzzystrmatch`,children:`repository`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-adds`,children:`What it adds`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Function`}),_jsx(_components.th,{children:`Returns`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vsql_fuzzystrmatch.soundex(s)`})}),_jsx(_components.td,{children:`text`}),_jsx(_components.td,{children:`The Soundex code, so names that sound alike share a value. Qualify this one, see the note below`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`difference(a, b)`})}),_jsx(_components.td,{children:`int`}),_jsx(_components.td,{children:`How many of the four Soundex positions match, 0 through 4`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`levenshtein(a, b)`})}),_jsx(_components.td,{children:`int`}),_jsx(_components.td,{children:`The edit distance`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`levenshtein_cost(a, b, ins, del, sub)`})}),_jsx(_components.td,{children:`int`}),_jsx(_components.td,{children:`The same, with your own cost per operation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`levenshtein_less_equal(a, b, max)`})}),_jsx(_components.td,{children:`int`}),_jsxs(_components.td,{children:[`The distance, giving up once it passes `,_jsx(_components.code,{children:`max`}),` and returning `,_jsx(_components.code,{children:`max`}),` plus 1`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`levenshtein_less_equal_cost(a, b, ins, del, sub, max)`})}),_jsx(_components.td,{children:`int`}),_jsx(_components.td,{children:`Both of the above together`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`metaphone(s, length)`})}),_jsx(_components.td,{children:`text`}),_jsxs(_components.td,{children:[`The Metaphone code, truncated to `,_jsx(_components.code,{children:`length`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`dmetaphone(s)`})}),_jsx(_components.td,{children:`text`}),_jsx(_components.td,{children:`The primary Double Metaphone code`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`dmetaphone_alt(s)`})}),_jsx(_components.td,{children:`text`}),_jsx(_components.td,{children:`The alternate code, falling back to the primary when there is none`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`example`,children:`Example`}),`\n`,_jsxs(_components.p,{children:[`Two spellings of the same name produce the same Soundex code, and `,_jsx(_components.code,{children:`difference`}),`\nscores the match out of 4:`]}),`\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:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` vsql_fuzzystrmatch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`soundex`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Robert'`}),_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:` robert,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` vsql_fuzzystrmatch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`soundex`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Rupert'`}),_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:` rupert,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` difference`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Robert'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Rupert'`}),_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:` same_sound;`})]}),`\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:`| robert | rupert | same_sound |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+--------+--------+------------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| R163 | R163 | 4 |`})}),`\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:`Edit distance counts the changes instead:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,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:`2`,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:` levenshtein(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'kitten'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'sitting'`}),_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:` edits,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` levenshtein_less_equal(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'kitten'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'sitting'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`}),_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:` capped_at_2;`})]}),`\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:`| edits | capped_at_2 |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+-------+-------------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| 3 | 3 |`})}),`\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:[`Metaphone handles the sounds that spelling hides, such as the `,_jsx(_components.code,{children:`Th`}),` in Thompson:`]}),`\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:` metaphone(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Thompson'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`10`}),_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:` metaphone, dmetaphone(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Thompson'`}),_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:` dmetaphone;`})]}),`\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:`| metaphone | dmetaphone |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+-----------+------------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`| 0MPSN | TMPSN |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`+-----------+------------+`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`MySQL has a `,_jsx(_components.code,{children:`SOUNDEX()`}),` of its own, and the built-in wins when you write the\nname unqualified. The two disagree: `,_jsx(_components.code,{children:`SOUNDEX('Ashcraft')`}),` returns `,_jsx(_components.code,{children:`A2613`}),`,\nwhile `,_jsx(_components.code,{children:`vsql_fuzzystrmatch.soundex('Ashcraft')`}),` returns `,_jsx(_components.code,{children:`A261`}),`. MySQL’s\nversion is documented as returning a string of any length, and the\nextension’s follows the four-character Soundex definition. Qualify the call\nwith the extension name to get the one you mean. No other function here is\nshadowed.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`levenshtein_less_equal`}),` stops as soon as the true distance passes the limit\nyou give it, and then returns the limit plus 1, whatever the true distance\nis. With a limit of 2 it returns 3 for a pair 3 apart and 3 for a pair 7\napart. Read the limit plus 1 as “further apart than you asked about”.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`see-also`,children:`See also`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/en/guides/fuzzy-string-matching`,children:`Fuzzy string matching in MySQL`}),` — choosing between phonetic codes and edit distance`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/en/guides/trigram-similarity`,children:`Trigram similarity`}),` — ranking partial matches instead of scoring pairs`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/en/extensions/install`,children:`Install extensions`}),` — how `,_jsx(_components.code,{children:`INSTALL EXTENSION`}),` works and where the server looks for a bundle`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/en/extensions/catalog`,children:`Available extensions`}),` — the full catalog`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://github.com/villagesql/vsql-fuzzystrmatch`,children:`villagesql/vsql-fuzzystrmatch`}),` — source, build instructions, and the known limitations`]}),`\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":"vsql_fuzzystrmatch extension for MySQL","sidebarTitle":"vsql_fuzzystrmatch","description":"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.","keywords":"mysql soundex, mysql levenshtein, mysql metaphone, mysql fuzzy name matching, vsql_fuzzystrmatch","audience":"villagesql-user","href":"/en/extensions/vsql-fuzzystrmatch"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Install","slug":"install","depth":2,"children":[]},{"title":"What it adds","slug":"what-it-adds","depth":2,"children":[]},{"title":"Example","slug":"example","depth":2,"children":[]},{"title":"See also","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":"vsql_fuzzystrmatch extension for MySQL - VillageSQL Server for MySQL - Documentation","contextualStarterQuestions":[{"_id":"6aed3c4b0975dbe7e5eb03aa","deploymentId":"690e4c8e612a67c5b7e46992","questionText":"What functions does it provide?","status":"active","generatedBy":"contextual","path":"en/extensions/vsql-fuzzystrmatch","createdAt":"2026-11-06T02:32:43.972Z","updatedAt":"2026-11-06T02:32:43.972Z","__v":0},{"_id":"6aed3c4b0975dbe7e5eb03ab","deploymentId":"690e4c8e612a67c5b7e46992","questionText":"How do I use Soundex matching?","status":"active","generatedBy":"contextual","path":"en/extensions/vsql-fuzzystrmatch","createdAt":"2026-11-06T02:32:43.972Z","updatedAt":"2026-11-06T02:32:43.972Z","__v":0},{"_id":"6aed3c4b0975dbe7e5eb03a9","deploymentId":"690e4c8e612a67c5b7e46992","questionText":"How do I install this extension?","status":"active","generatedBy":"contextual","path":"en/extensions/vsql-fuzzystrmatch","createdAt":"2026-11-06T02:32:43.972Z","updatedAt":"2026-11-06T02:32:43.972Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/extensions/vsql-fuzzystrmatch","matchLevel":0},"ja":{"href":"/ja/extensions/vsql-fuzzystrmatch","matchLevel":1},"ko":{"href":"/ko/extensions/vsql-fuzzystrmatch","matchLevel":1},"zh":{"href":"/zh/extensions/vsql-fuzzystrmatch","matchLevel":1},"pt-BR":{"href":"/pt-BR/extensions/vsql-fuzzystrmatch","matchLevel":1}}},"lastModified":"2026-11-06T02:31:23.677Z","originalFileLocation":"en/extensions/vsql-fuzzystrmatch.mdx","locale":"en"},"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=\"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.\">\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=\"vsql_fuzzystrmatch extension for MySQL - VillageSQL Server for MySQL - Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"VillageSQL Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch\">\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=Available+Extensions\u0026amp;title=vsql_fuzzystrmatch+extension+for+MySQL\u0026amp;description=The+vsql_fuzzystrmatch+extension+adds+Soundex%2C+Metaphone%2C+Double+Metaphone%2C+and+Levenshtein+edit+distance+to+MySQL+for+name+matching+and+deduplication.\u0026amp;theme=88e90f7620ba1dac07c284b1\u0026amp;signature=2dc4cacde56cf5481624c2e094596d78afc4b9cc6a7e5334907a1ce524b0103e\">\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=\"vsql_fuzzystrmatch extension for MySQL - VillageSQL Server for MySQL - Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://villagesql.mintlify.site/docs/_mintlify/api/og/v2?division=Available+Extensions\u0026amp;title=vsql_fuzzystrmatch+extension+for+MySQL\u0026amp;description=The+vsql_fuzzystrmatch+extension+adds+Soundex%2C+Metaphone%2C+Double+Metaphone%2C+and+Levenshtein+edit+distance+to+MySQL+for+name+matching+and+deduplication.\u0026amp;theme=88e90f7620ba1dac07c284b1\u0026amp;signature=2dc4cacde56cf5481624c2e094596d78afc4b9cc6a7e5334907a1ce524b0103e\">\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/en/extensions/vsql-fuzzystrmatch\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/en/extensions/vsql-fuzzystrmatch.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://villagesql.com/docs/ja/extensions/vsql-fuzzystrmatch\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://villagesql.com/docs/ko/extensions/vsql-fuzzystrmatch\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://villagesql.com/docs/zh/extensions/vsql-fuzzystrmatch\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt-BR\" href=\"https://villagesql.com/docs/pt-BR/extensions/vsql-fuzzystrmatch\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch\">\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/en/extensions/vsql-fuzzystrmatch#webpage\",\"url\":\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch\",\"name\":\"vsql_fuzzystrmatch extension for MySQL\",\"description\":\"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.\",\"dateModified\":\"2026-11-06T02:31:23.677Z\",\"isPartOf\":{\"@id\":\"https://villagesql.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Extension Catalog\",\"item\":\"https://villagesql.com/docs/en/extensions/vsql-ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Available Extensions\",\"item\":\"https://villagesql.com/docs/en/extensions/catalog\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"vsql_fuzzystrmatch extension for MySQL\",\"item\":\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch#article\",\"headline\":\"vsql_fuzzystrmatch extension for MySQL\",\"name\":\"vsql_fuzzystrmatch extension for MySQL\",\"description\":\"The vsql_fuzzystrmatch extension adds Soundex, Metaphone, Double Metaphone, and Levenshtein edit distance to MySQL for name matching and deduplication.\",\"url\":\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch\",\"mainEntityOfPage\":{\"@id\":\"https://villagesql.com/docs/en/extensions/vsql-fuzzystrmatch#webpage\"},\"dateModified\":\"2026-11-06T02:31:23.677Z\",\"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,"tabs":[{"tab":"Overview","pages":[{"title":"Overview","href":""}]},{"tab":"Extensions","groups":[{"group":"Install and Run Extensions","pages":[{"title":"Installing Extensions","href":"/en/extensions/install"},{"title":"Uninstalling Extensions","href":"/en/extensions/uninstall"},{"title":"Managing Extensions","href":"/en/extensions/managing"}]},{"group":"Extension Catalog","pages":[{"group":"Available Extensions","root":{"title":"Available Extensions","href":"/en/extensions/catalog"},"expanded":false,"pages":[{"title":"vsql_ai extension for MySQL","sidebarTitle":"vsql_ai","href":"/en/extensions/vsql-ai"},{"title":"vsql_boolean extension for MySQL","sidebarTitle":"vsql_boolean","href":"/en/extensions/vsql-boolean"},{"title":"vsql_crypto extension for MySQL","sidebarTitle":"vsql_crypto","href":"/en/extensions/vsql-crypto"},{"title":"vsql_cube extension for MySQL","sidebarTitle":"vsql_cube","href":"/en/extensions/vsql-cube"},{"title":"vsql_currency extension for MySQL","sidebarTitle":"vsql_currency","href":"/en/extensions/vsql-currency"},{"title":"vsql_duckdb extension for MySQL","sidebarTitle":"vsql_duckdb","description":"The vsql_duckdb extension runs DuckDB inside MySQL, so a query can read Parquet, CSV, and JSON files from object storage or disk and return rows as JSON.","href":"/en/extensions/vsql-duckdb"},{"title":"vsql_fuzzystrmatch extension for MySQL","sidebarTitle":"vsql_fuzzystrmatch","href":"/en/extensions/vsql-fuzzystrmatch"},{"title":"vsql_http extension for MySQL","sidebarTitle":"vsql_http","description":"The vsql_http extension makes GET, POST, PUT, PATCH, and DELETE requests from inside a MySQL query, returning each response as JSON.","href":"/en/extensions/vsql-http"},{"title":"vsql_mcp extension for MySQL","sidebarTitle":"vsql_mcp","href":"/en/extensions/vsql-mcp"},{"title":"vsql_network_address extension for MySQL","sidebarTitle":"vsql_network_address","href":"/en/extensions/vsql-network-address"},{"title":"vsql_oauth2 extension for MySQL","sidebarTitle":"vsql_oauth2","href":"/en/extensions/vsql-oauth2"},{"title":"vsql_rest extension for MySQL","sidebarTitle":"vsql_rest","href":"/en/extensions/vsql-rest"},{"title":"vsql_stat_ch extension for MySQL","sidebarTitle":"vsql_stat_ch","href":"/en/extensions/vsql-stat-ch"},{"title":"vsql_trgm extension for MySQL","sidebarTitle":"vsql_trgm","href":"/en/extensions/vsql-trgm"},{"title":"vsql_uuid extension for MySQL","sidebarTitle":"vsql_uuid","href":"/en/extensions/vsql-uuid"},{"title":"prometheus_exporter extension for MySQL","sidebarTitle":"prometheus_exporter","href":"/en/extensions/prometheus-exporter"},{"title":"vsql_address_standardizer extension for MySQL","sidebarTitle":"vsql_address_standardizer","href":"/en/extensions/vsql-address-standardizer"},{"title":"vsql_luhn extension for MySQL","sidebarTitle":"vsql_luhn","href":"/en/extensions/vsql-luhn"},{"title":"vsql_nanoid extension for MySQL","sidebarTitle":"vsql_nanoid","href":"/en/extensions/vsql-nanoid"},{"title":"vsql_pgjwt extension for MySQL","sidebarTitle":"vsql_pgjwt","href":"/en/extensions/vsql-pgjwt"},{"title":"vsql_slugify extension for MySQL","sidebarTitle":"vsql_slugify","href":"/en/extensions/vsql-slugify"},{"title":"vsql_statistics extension for MySQL","sidebarTitle":"vsql_statistics","href":"/en/extensions/vsql-statistics"},{"title":"vsql_complex extension for MySQL","sidebarTitle":"vsql_complex","href":"/en/extensions/vsql-complex"}]}]},{"group":"Build an Extension","pages":[{"title":"Creating Extensions in C++","href":"/en/extensions/build/create"},{"title":"Creating Extensions in Rust","href":"/en/extensions/build/rust-sdk"},{"title":"Extensions or Plugins and Components","href":"/en/extensions/build/extensions-or-plugins"},{"title":"Extension Architecture","href":"/en/extensions/build/architecture"},{"title":"How Extensions and the ABI Behave","href":"/en/extensions/build/extension-abi-behavior"},{"group":"Advanced Topics","expanded":false,"pages":[{"title":"Preview Capabilities","href":"/en/extensions/build/preview-capabilities"},{"title":"Custom Indexes","href":"/en/extensions/build/custom-indexes"},{"title":"VEF Coverage Compared to PostgreSQL","href":"/en/extensions/build/postgresql-hooks"},{"title":"Protocol 1 API","href":"/en/extensions/build/protocol-1"}]}]}]},{"tab":"Server","menu":[{"item":"MySQL 8.4","icon":"database","pages":[{"title":"MySQL 8.4","href":"/en/8.4/stable/introduction"}]},{"item":"Percona Server 8.4","icon":"database","pages":[{"title":"Percona Server 8.4","href":"/en/8.4/stable/percona"}]},{"item":"MySQL 9.7","icon":"database","pages":[{"title":"MySQL 9.7","href":"/en/9.7/stable/introduction"}]},{"item":"Dev releases","icon":"flask","pages":[{"title":"Dev releases","href":"/en/dev-releases"}]},{"item":"Past releases","icon":"clock-rotate-left","pages":[{"title":"Past releases","href":"/en/past-releases"}]}],"pages":[{"title":"Server","href":"/en/8.4/stable/introduction"}]},{"tab":"Reference","menu":[{"item":"C++ SDK","icon":"code","pages":[{"title":"C++ SDK","href":"/en/sdk/cpp/extension-api-reference"}]},{"item":"Rust SDK","icon":"rust","pages":[{"title":"Rust SDK","href":"/en/sdk/rust/api-reference"}]}],"pages":[{"title":"Reference","href":"/en/sdk/cpp/extension-api-reference"}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/en/tutorial"}]},{"tab":"Resources","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":"Issues","icon":"bug","href":"https://github.com/villagesql/villagesql-server/issues"},{"item":"Discord","icon":"discord","href":"https://discord.gg/KSr6whd3Fr"},{"item":"Blog","icon":"newspaper","href":"https://villagesql.com/blog"},{"item":"Contribute to the Server","icon":"code-pull-request","href":"https://github.com/villagesql/villagesql-server/blob/main/CONTRIBUTING.md"},{"item":"Contribute to the Docs","icon":"pen-nib","href":"https://github.com/villagesql/villagesql-docs/blob/main/CONTRIBUTING.md"}]}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/extensions/vsql-fuzzystrmatch"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/extensions/vsql-fuzzystrmatch"}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/extensions/vsql-fuzzystrmatch"}]},{"language":"pt-BR","pages":[{"title":"pt-BR","href":"/pt-BR/extensions/vsql-fuzzystrmatch"}]}]},"basePath":"","title":"vsql_fuzzystrmatch extension for MySQL - VillageSQL Server for MySQL - Documentation","buildId":"dpl_CEsowfH15TDzsBT2BFbX312Be4Ct","deploymentId":"dpl_CEsowfH15TDzsBT2BFbX312Be4Ct","dynamics":[],"chunks":[]}