Po prostu przekształcam mój wcześniejszy komentarz w odpowiedź, ponieważ wydawało się to właściwym rozwiązaniem :-)
Problem pochodzi z innej linii. Masz to:
x = c.execute("SELECT * FROM users WHERE email = (%s)",
(email))
To nie robi tego, co mogłoby się wydawać. Wstawianie email
w nawiasach nic nie robi, więc wiersz jest właściwie równoważny z przekazaniem każdego znaku tego, co znajduje się w tej zmiennej na liście znaków. Jeśli zamiast tego zrobisz to:
x = c.execute("SELECT * FROM users WHERE email = (%s)",
(email,))
...wtedy będziesz przekazywać krotkę zawierającą jeden element, email
i powinno działać lepiej.