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
table = "table"
        rows = [("hello",), ("world",)]
        target_fields = ["field"]
        self.db_hook.insert_rows(table, rows, target_fields)
        assert self.conn.close.call_count == 1
        assert self.cur.close.call_count == 1
        commit_count = 2  
        self.assertEqual(commit_count, self.conn.commit.call_count)
        sql = "INSERT INTO {} ({}) VALUES (%s)".format(table, target_fields[0])
        for row in rows:
            self.cur.execute.assert_any_call(sql, row)
    def test_insert_rows_commit_every(self):
        table = "table"
        rows = [("hello",), ("world",)]
        commit_every = 1
        self.db_hook.insert_rows(table, rows, commit_every=commit_every)
        assert self.conn.close.call_count == 1
        assert self.cur.close.call_count == 1
        commit_count = 2 + divmod(len(rows), commit_every)[0]
        self.assertEqual(commit_count, self.conn.commit.call_count)
        sql = f"INSERT INTO {table}  VALUES (%s)"
        for row in rows:
            self.cur.execute.assert_any_call(sql, row)
    def test_get_uri_schema_not_none(self):