Hanya mengubah komentar saya sebelumnya menjadi jawaban, karena sepertinya itu solusi yang tepat :-)
Masalahnya datang dari jalur yang berbeda. Anda memiliki ini:
x = c.execute("SELECT * FROM users WHERE email = (%s)",
(email))
Ini tidak melakukan apa yang mungkin Anda pikirkan. Menempatkan email dalam tanda kurung tidak melakukan apa-apa, jadi baris sebenarnya setara dengan meneruskan setiap karakter dari apa pun yang ada dalam variabel itu dalam daftar karakter. Jika Anda melakukan ini:
x = c.execute("SELECT * FROM users WHERE email = (%s)",
(email,))
...maka Anda akan mengirimkan Tuple yang berisi satu item, email , dan itu akan bekerja lebih baik.