Você verificou se o valor que fica armazenado no banco de dados é realmente U+003f (ponto de interrogação)? Existem todos os tipos de convenções sobre como exibir caracteres que não existem na fonte escolhida e exibi-los como ?' é bastante comum.
Então, muito provavelmente, o caractere é armazenado corretamente e, por qualquer motivo, simplesmente é exibido como '?'. Basicamente, ignore como ele é renderizado e observe qual codepoint é armazenado no banco de dados. É U+9996 ou U+003f (ou algo totalmente diferente)? Não assuma cegamente que só porque é renderizado como um ponto de interrogação, é na verdade um ponto de interrogação armazenado no banco de dados.