2016-11-04 3 views
0

У меня есть столбец в таблице, который определяется как Varchar2(4000) под названием tbl_varchar. Я получаю входной аргумент от клиента к хранимой процедуре, которая также равна varchar2(4000). Я называю это input_varchar.Сравнение varchar2 в Oracle с разными кодировками?

Я хочу обновить только если содержимое изменилось:

Update table t SET tbl_varchar = input_varchar, updated = sysdate 
WHERE key = input_key and tbl_varchar != input_varchar; 

Я бегу это с тем же входным несколько раз и вижу, что моя метка времени обновляется каждый раз, но данные VARCHAR не кажется, изменение.

Может ли это иметь какое-либо отношение к различным наборам символов на клиенте и базе данных? Если да, то как лучше всего это подтвердить? У меня нет контроля над клиентом.

+0

Оба столбца 'varchar2' должны, по определению, быть тем же набором символов. Возможно (ну, почти наверняка), что происходит преобразование набора символов из Java, где строки UTF-16 закодированы в Oracle, где «varchar2» не может кодироваться в кодировке UTF-16. Но это должно быть последовательным из того же приложения. Очень маловероятно, что вы запускаете одно и то же приложение на одной машине несколько раз и получаете другой результат. –

ответ

0

Если это про кодировки вы можете попробовать:

Update table t SET tbl_varchar = input_varchar, updated = sysdate 
WHERE key = input_key and convert(tbl_varchar, 'US7ASCII') != convert(input_varchar, 'US7ASCII'); 

Или поставить кодировку вместо 'US7ASCII'

Я бы также добавить trim() оба значения. Возможно, проблема связана с некоторыми пробелами.

Смежные вопросы