Я почти уверен, что сообщение об ошибке буквально истинно: 0xa0 не является допустимым символом UTF-8.
Мой домашний сервер работает под управлением PostgreSQL в Windows XP, SP3.Я могу сделать это в psql.
sandbox=# show client_encoding;
client_encoding
-----------------
UTF8
(1 row)
sandbox=# show lc_numeric;
lc_numeric
---------------
polish_poland
(1 row)
sandbox=# SELECT TO_CHAR(76543210.98, '999G999G990D00');
to_char
-----------------
76 543 210,98
(1 row)
Я не получаю сообщение об ошибке, но я получаю мусор для разделителя.Может ли это быть проблемой кодовой страницы?
В качестве обходного пути я использую пробел вместо G в строке формата
Давайте подумаем об этом.Если вы используете пробел, то на веб-странице значение может разделиться в конце строки или на границе ячейки таблицы.Я думаю, что неразрывное пространство может быть лучшим выбором.
И в Unicode неразрывный пробел равен 0xa0.В Unicode, а не в UTF8.(То есть 0xa0 не может быть первым байтом символа UTF8. См. Распределение битов UTF-8 .)
Другая возможность состоит в том, что ваш клиент ожидает один порядок байтов, исервер дает ему другой порядок байтов.Поскольку числа являются однобайтовыми символами, порядок байтов не будет иметь значения, пока, ну, это не имеет значения.Если клиент ожидает символа с прямым порядком байтов MB, и он получил символ с прямым порядком байтов MB, начинающийся с 0xa0, я ожидаю, что он умрет с сообщением об ошибке, которое вы видели.Я не уверен, что у меня есть способ проверить это, прежде чем я пойду на работу сегодня.