Use AsCharBuffer to get C strings out of Python strings.
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index ca15eed..cbb030e 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -409,8 +409,8 @@
 PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args)
 {
     PyObject* operation;
-    PyObject* operation_bytestr = NULL;
-    char* operation_cstr;
+    const char* operation_cstr;
+    Py_ssize_t operation_len;
     PyObject* parameters_list = NULL;
     PyObject* parameters_iter = NULL;
     PyObject* parameters = NULL;
@@ -495,16 +495,8 @@
         rc = pysqlite_statement_reset(self->statement);
     }
 
-    if (PyString_Check(operation)) {
-        operation_cstr = PyString_AsString(operation);
-    } else {
-        operation_bytestr = PyUnicode_AsUTF8String(operation);
-        if (!operation_bytestr) {
-            goto error;
-        }
-
-        operation_cstr = PyString_AsString(operation_bytestr);
-    }
+    if (PyObject_AsCharBuffer(operation, &operation_cstr, &operation_len) < 0)
+        goto error;
 
     /* reset description and rowcount */
     Py_DECREF(self->description);
@@ -714,7 +706,6 @@
     }
 
 error:
-    Py_XDECREF(operation_bytestr);
     Py_XDECREF(parameters);
     Py_XDECREF(parameters_iter);
     Py_XDECREF(parameters_list);
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c
index 870e776..8a4ea6a 100644
--- a/Modules/_sqlite/statement.c
+++ b/Modules/_sqlite/statement.c
@@ -44,30 +44,20 @@
 {
     const char* tail;
     int rc;
-    PyObject* sql_str;
-    char* sql_cstr;
+    const char* sql_cstr;
+    Py_ssize_t sql_cstr_len;
 
     self->st = NULL;
     self->in_use = 0;
 
-    if (PyString_Check(sql)) {
-        sql_str = sql;
-        Py_INCREF(sql_str);
-    } else if (PyUnicode_Check(sql)) {
-        sql_str = PyUnicode_AsUTF8String(sql);
-        if (!sql_str) {
-            rc = PYSQLITE_SQL_WRONG_TYPE;
-            return rc;
-        }
-    } else {
+    if (PyObject_AsCharBuffer(sql, &sql_cstr, &sql_cstr_len) < 0) {
         rc = PYSQLITE_SQL_WRONG_TYPE;
         return rc;
     }
 
     self->in_weakreflist = NULL;
-    self->sql = sql_str;
-
-    sql_cstr = PyString_AsString(sql_str);
+    Py_INCREF(sql);
+    self->sql = sql;
 
     rc = sqlite3_prepare(connection->db,
                          sql_cstr,
@@ -219,10 +209,14 @@
 {
     const char* tail;
     int rc;
-    char* sql_cstr;
+    const char* sql_cstr;
+    Py_ssize_t sql_len;
     sqlite3_stmt* new_st;
 
-    sql_cstr = PyString_AsString(self->sql);
+    if (PyObject_AsCharBuffer(self->sql, &sql_cstr, &sql_len) < 0) {
+        rc = PYSQLITE_SQL_WRONG_TYPE;
+        return rc;
+    }
 
     rc = sqlite3_prepare(self->db,
                          sql_cstr,