"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[8342],{25832:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(83117),a=(n(67294),n(3905));const o={title:"MySQL",hide_title:!0,sidebar_position:25,version:1},i=void 0,l={unversionedId:"databases/mysql",id:"databases/mysql",title:"MySQL",description:"MySQL",source:"@site/docs/databases/mysql.mdx",sourceDirName:"databases",slug:"/databases/mysql",permalink:"/docs/databases/mysql",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/databases/mysql.mdx",tags:[],version:"current",sidebarPosition:25,frontMatter:{title:"MySQL",hide_title:!0,sidebar_position:25,version:1},sidebar:"tutorialSidebar",previous:{title:"IBM Netezza Performance Server",permalink:"/docs/databases/netezza"},next:{title:"Oracle",permalink:"/docs/databases/oracle"}},s={},c=[{value:"MySQL",id:"mysql",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"mysql"},"MySQL"),(0,a.kt)("p",null,"The recommended connector library for MySQL is ",(0,a.kt)("a",{parentName:"p",href:"https://pypi.org/project/mysqlclient/"},"mysqlclient"),"."),(0,a.kt)("p",null,"Here's the connection string:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"mysql://{username}:{password}@{host}/{database}\n")),(0,a.kt)("p",null,"Host:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"For Localhost: ",(0,a.kt)("inlineCode",{parentName:"li"},"localhost")," or ",(0,a.kt)("inlineCode",{parentName:"li"},"127.0.0.1")),(0,a.kt)("li",{parentName:"ul"},"Docker running on Linux: ",(0,a.kt)("inlineCode",{parentName:"li"},"172.18.0.1")),(0,a.kt)("li",{parentName:"ul"},"For On Prem: IP address or Host name"),(0,a.kt)("li",{parentName:"ul"},"For Docker running in OSX: ",(0,a.kt)("inlineCode",{parentName:"li"},"docker.for.mac.host.internal"),"\nPort: ",(0,a.kt)("inlineCode",{parentName:"li"},"3306")," by default")),(0,a.kt)("p",null,"One problem with ",(0,a.kt)("inlineCode",{parentName:"p"},"mysqlclient")," is that it will fail to connect to newer MySQL databases using ",(0,a.kt)("inlineCode",{parentName:"p"},"caching_sha2_password")," for authentication, since the plugin is not included in the client. In this case, you should use ",(0,a.kt)("a",{parentName:"p",href:"https://pypi.org/project/mysql-connector-python/"},"mysql-connector-python")," instead:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"mysql+mysqlconnector://{username}:{password}@{host}/{database}\n")))}d.isMDXComponent=!0},3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>y});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),m=a,y=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(y,i(i({ref:t},p),{},{components:n})):r.createElement(y,i({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"}}]);