diff --git a/setup.py b/setup.py
index 7dcdba3..b23fe05 100755
--- a/setup.py
+++ b/setup.py
@@ -161,7 +161,7 @@ def get_compiler_settings():
 
         # Python functions take a lot of 'char *' that really should be const.  gcc complains
         # about this *a lot*.
-        settings['extra_compile_args'].append('-Wno-write-strings')
+        #settings['extra_compile_args'].append('-Wno-write-strings')
 
         fd = os.popen('odbc_config --cflags 2>/dev/null')
         cflags = fd.read().strip()
diff --git a/src/connection.cpp b/src/connection.cpp
index 1a50d2b..b90a116 100644
--- a/src/connection.cpp
+++ b/src/connection.cpp
@@ -18,7 +18,7 @@
 #include "cnxninfo.h"
 
 
-static char connection_doc[] =
+static const char connection_doc[] =
     "Connection objects manage connections to the database.\n"
     "\n"
     "Each manages a single ODBC HDBC.";
@@ -345,7 +345,7 @@ PyObject* Connection_New(PyObject* pConnectString, bool fAutoCommit, long timeou
     return reinterpret_cast<PyObject*>(cnxn);
 }
 
-static char set_attr_doc[] =
+static const char set_attr_doc[] =
     "set_attr(attr_id, value) -> None\n\n"
     "Calls SQLSetConnectAttr with the given values.\n\n"
     "attr_id\n"
@@ -373,7 +373,7 @@ static PyObject* Connection_set_attr(PyObject* self, PyObject* args)
     Py_RETURN_NONE;
 }
 
-static char conv_clear_doc[] =
+static const char conv_clear_doc[] =
     "clear_output_converters() --> None\n\n"
     "Remove all output converter functions.";
 
@@ -435,7 +435,7 @@ static void Connection_dealloc(PyObject* self)
     PyObject_Del(self);
 }
 
-static char close_doc[] =
+static const char close_doc[] =
     "Close the connection now (rather than whenever __del__ is called).\n"
     "\n"
     "The connection will be unusable from this point forward and a ProgrammingError\n"
@@ -785,10 +785,10 @@ static PyObject* Connection_rollback(PyObject* self, PyObject* args)
     return Connection_endtrans(cnxn, SQL_ROLLBACK);
 }
 
-static char cursor_doc[] =
+static const char cursor_doc[] =
     "Return a new Cursor object using the connection.";
 
-static char execute_doc[] =
+static const char execute_doc[] =
     "execute(sql, [params]) --> Cursor\n"
     "\n"
     "Create a new Cursor object, call its execute method, and return it.  See\n"
@@ -798,13 +798,13 @@ static char execute_doc[] =
     "Cursor is allocated by each call, this should not be used if more than one SQL\n"
     "statement needs to be executed.";
 
-static char commit_doc[] =
+static const char commit_doc[] =
     "Commit any pending transaction to the database.";
 
-static char rollback_doc[] =
+static const char rollback_doc[] =
     "Causes the the database to roll back to the start of any pending transaction.";
 
-static char getinfo_doc[] =
+static const char getinfo_doc[] =
     "getinfo(type) --> str | int | bool\n"
     "\n"
     "Calls SQLGetInfo, passing `type`, and returns the result formatted as a Python object.";
@@ -1029,7 +1029,7 @@ static bool _add_converter(PyObject* self, SQLSMALLINT sqltype, PyObject* func)
     return PyDict_SetItem(cnxn->map_sqltype_to_converter, n.Get(), func) != -1;
 }
 
-static char conv_add_doc[] =
+static const char conv_add_doc[] =
     "add_output_converter(sqltype, func) --> None\n"
     "\n"
     "Register an output converter function that will be called whenever a value with\n"
@@ -1070,7 +1070,7 @@ static PyObject* Connection_conv_add(PyObject* self, PyObject* args)
     Py_RETURN_NONE;
 }
 
-static char conv_remove_doc[] =
+static const char conv_remove_doc[] =
     "remove_output_converter(sqltype) --> None\n"
     "\n"
     "Remove an output converter function that was registered with\n"
@@ -1095,7 +1095,7 @@ static PyObject* Connection_conv_remove(PyObject* self, PyObject* args)
     Py_RETURN_NONE;
 }
 
-static char conv_get_doc[] =
+static const char conv_get_doc[] =
     "get_output_converter(sqltype) --> <class 'function'>\n"
     "\n"
     "Get the output converter function that was registered with\n"
@@ -1275,7 +1275,7 @@ static PyObject* Connection_setencoding(PyObject* self, PyObject* args, PyObject
     // In Python 3 we only support encodings for Unicode text.
     char* encoding = 0;
     int ctype = 0;
-    static char *kwlist[] = { "encoding", "ctype", 0 };
+    static const char *kwlist[] = { "encoding", "ctype", 0 };
     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &encoding, &ctype))
         return 0;
     TextEnc& enc = cnxn->unicode_enc;
@@ -1286,7 +1286,7 @@ static PyObject* Connection_setencoding(PyObject* self, PyObject* args, PyObject
     Py_RETURN_NONE;
 }
 
-static char setdecoding_doc[] =
+static const char setdecoding_doc[] =
     "setdecoding(sqltype, encoding=None, ctype=None) --> None\n"
     "\n"
     "Configures how text of type `ctype` (SQL_CHAR or SQL_WCHAR) is decoded\n"
@@ -1309,7 +1309,7 @@ static PyObject* Connection_setdecoding(PyObject* self, PyObject* args, PyObject
     char* encoding = 0;
     int ctype = 0;
 
-    static char *kwlist[] = {"sqltype", "encoding", "ctype", NULL};
+    static const char *kwlist[] = {"sqltype", "encoding", "ctype", NULL};
     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|si", kwlist, &sqltype, &encoding, &ctype))
         return 0;
 
@@ -1327,7 +1327,7 @@ static PyObject* Connection_setdecoding(PyObject* self, PyObject* args, PyObject
 
 
 
-static char enter_doc[] = "__enter__() -> self.";
+static const char enter_doc[] = "__enter__() -> self.";
 static PyObject* Connection_enter(PyObject* self, PyObject* args)
 {
     UNUSED(args);
@@ -1335,7 +1335,7 @@ static PyObject* Connection_enter(PyObject* self, PyObject* args)
     return self;
 }
 
-static char exit_doc[] = "__exit__(*excinfo) -> None.  Commits the connection if necessary.";
+static const char exit_doc[] = "__exit__(*excinfo) -> None.  Commits the connection if necessary.";
 static PyObject* Connection_exit(PyObject* self, PyObject* args)
 {
     Connection* cnxn = (Connection*)self;
diff --git a/src/cursor.cpp b/src/cursor.cpp
index 0800245..1baf0c7 100644
--- a/src/cursor.cpp
+++ b/src/cursor.cpp
@@ -1365,7 +1365,7 @@ static char tables_doc[] =
     " 3) table_type: One of 'TABLE', 'VIEW', SYSTEM TABLE', 'GLOBAL TEMPORARY'\n"
     "    'LOCAL TEMPORARY', 'ALIAS', 'SYNONYM', or a data source-specific type name.";
 
-char* Cursor_tables_kwnames[] = { "table", "catalog", "schema", "tableType", 0 };
+const char* Cursor_tables_kwnames[] = { "table", "catalog", "schema", "tableType", 0 };
 
 static PyObject* Cursor_tables(PyObject* self, PyObject* args, PyObject* kwargs)
 {
@@ -1434,7 +1434,7 @@ static char columns_doc[] =
     " 16) ordinal_position\n"
     " 17) is_nullable";
 
-char* Cursor_column_kwnames[] = { "table", "catalog", "schema", "column", 0 };
+const char* Cursor_column_kwnames[] = { "table", "catalog", "schema", "column", 0 };
 
 static PyObject* Cursor_columns(PyObject* self, PyObject* args, PyObject* kwargs)
 {
@@ -1517,7 +1517,7 @@ static char statistics_doc[] =
     " 11) pages\n"
     " 12) filter_condition";
 
-char* Cursor_statistics_kwnames[] = { "table", "catalog", "schema", "unique", "quick", 0 };
+const char* Cursor_statistics_kwnames[] = { "table", "catalog", "schema", "unique", "quick", 0 };
 
 static PyObject* Cursor_statistics(PyObject* self, PyObject* args, PyObject* kwargs)
 {
@@ -1596,7 +1596,7 @@ static char rowVerColumns_doc[] =
     " 6) decimal_digits\n"
     " 7) pseudo_column";
 
-char* Cursor_specialColumn_kwnames[] = { "table", "catalog", "schema", "nullable", 0 };
+const char* Cursor_specialColumn_kwnames[] = { "table", "catalog", "schema", "nullable", 0 };
 
 static PyObject* _specialColumns(PyObject* self, PyObject* args, PyObject* kwargs, SQLUSMALLINT nIdType)
 {
@@ -1668,7 +1668,7 @@ static char primaryKeys_doc[] =
     " 4) key_seq\n"
     " 5) pk_name";
 
-char* Cursor_primaryKeys_kwnames[] = { "table", "catalog", "schema", 0 };
+const char* Cursor_primaryKeys_kwnames[] = { "table", "catalog", "schema", 0 };
 
 static PyObject* Cursor_primaryKeys(PyObject* self, PyObject* args, PyObject* kwargs)
 {
@@ -1735,7 +1735,7 @@ static char foreignKeys_doc[] =
     " 12) pk_name\n"
     " 13) deferrability";
 
-char* Cursor_foreignKeys_kwnames[] = { "table", "catalog", "schema", "foreignTable", "foreignCatalog", "foreignSchema", 0 };
+const char* Cursor_foreignKeys_kwnames[] = { "table", "catalog", "schema", "foreignTable", "foreignCatalog", "foreignSchema", 0 };
 
 static PyObject* Cursor_foreignKeys(PyObject* self, PyObject* args, PyObject* kwargs)
 {
@@ -1978,7 +1978,7 @@ static char procedureColumns_doc[] =
     " 17) ordinal_position\n"
     " 18) is_nullable";
 
-char* Cursor_procedureColumns_kwnames[] = { "procedure", "catalog", "schema", 0 };
+const char* Cursor_procedureColumns_kwnames[] = { "procedure", "catalog", "schema", 0 };
 
 static PyObject* Cursor_procedureColumns(PyObject* self, PyObject* args, PyObject* kwargs)
 {
@@ -2037,7 +2037,7 @@ static char procedures_doc[] =
     " 6) remarks\n"
     " 7) procedure_type";
 
-char* Cursor_procedures_kwnames[] = { "procedure", "catalog", "schema", 0 };
+const char* Cursor_procedures_kwnames[] = { "procedure", "catalog", "schema", 0 };
 
 static PyObject* Cursor_procedures(PyObject* self, PyObject* args, PyObject* kwargs)
 {
diff --git a/src/errors.cpp b/src/errors.cpp
index 6cc230b..0153fde 100644
--- a/src/errors.cpp
+++ b/src/errors.cpp
@@ -10,7 +10,7 @@
 
 struct SqlStateMapping
 {
-    char* prefix;
+    const char* prefix;
     size_t prefix_len;
     PyObject** pexc_class;      // Note: Double indirection (pexc_class) necessary because the pointer values are not
                                 // initialized during startup
diff --git a/src/params.cpp b/src/params.cpp
index 089202a..ad28328 100644
--- a/src/params.cpp
+++ b/src/params.cpp
@@ -1469,7 +1469,7 @@ bool PrepareAndBind(Cursor* cur, PyObject* pSql, PyObject* original_params, bool
 bool ExecuteMulti(Cursor* cur, PyObject* pSql, PyObject* paramArrayObj)
 {
     bool ret = true;
-    char *szLastFunction = 0;
+    const char *szLastFunction = 0;
     SQLRETURN rc = SQL_SUCCESS;
     if (!Prepare(cur, pSql))
         return false;
