Всякий раз, когда база данных изменяет символ на ?
, это просто означает, что кодовая точка рассматриваемого символа полностью выходит за пределы диапазона кодировки символов, так как таблица настроена для использования.
Что касается причины проблемы: ç
находится в диапазоне ISO-8859-1 и имеет точно такую же кодовую точку, как в UTF-8 ( U + 00E7).Однако кодовая точка UTF-8 ş
полностью выходит за пределы диапазона ISO-8859-1 ( U + 015F , в то время как ISO-8859-1 поднимается только до U + 00FF).БД не сохранит символ и заменит его на ?
.
Итак, я подозреваю, что ваша таблица БД все еще настроена на использование ISO-8859-1 (или в одном из других совместимых ISO-8859кодировки, где ç
имеет ту же кодовую точку, что и в UTF-8).
API Java / JDBC отлично справляется со своей задачей в отношении кодировки символов (Java полностью использует Unicode), и кодировка соединения JDBC DB также настроена правильно.Если бы Java / JDBC неправильно использовал ISO-8859-1, то постоянный результат был бы Åakça
(существует ş
байтов 0xC5
и 0x9F
, что представляет Å
и a
в ISO-8859-1 и ç
существуют байтов 0xC3
и 0xA7
, которые представляют Ã
и §
в ISO-8859-1).