Hello,

I have recently noticed that a lot of connections with certain special characters don't work with SqlAlchemy as it requires the passwords to be [urlencoded when they contain special characters](https://stackoverflow.com/questions/1423804/writing-a-connection-string-when-password-contains-special-characters). 

Would there be any impact to changing the code at line 81 to urlencode the password like `urllib.parse.quote_plus(conn.password)` to prevent login failures for special characters? 

https://github.com/apache/airflow/blob/dee304b222d355b03794aa063f39e3ee13997730/airflow/hooks/dbapi_hook.py#L72-L88

I initially caught this issue while using the OdbcHook method found here. https://github.com/apache/airflow/blob/dee304b222d355b03794aa063f39e3ee13997730/airflow/providers/odbc/hooks/odbc.py#L198-L204

Happy to create a feature request, I just want to confirm that this issue makes sense. 


tests/hooks/test_dbapi_hook.py
self.db_hook.get_connection = mock.MagicMock(
            return_value=Connection(
                conn_type="conn_type",
                host="host",
                login="login",
                password="password",
                schema="schema",
                port=1,
            )
        )
        self.assertEqual("conn_type://login:password@host:1/schema", self.db_hook.get_uri())
    def test_get_uri_schema_none(self):
        self.db_hook.get_connection = mock.MagicMock(
            return_value=Connection(
                conn_type="conn_type", host="host", login="login", password="password", schema=None, port=1
            )
        )
        self.assertEqual("conn_type://login:password@host:1/", self.db_hook.get_uri())
    def test_run_log(self):
        statement = 'SQL'
        self.db_hook.run(statement)
        assert self.db_hook.log.info.call_count == 2