Java всегда передача значением . К сожалению, когда мы передаем значение объекта, мы передаем ссылка к нему. Это сбивает с толку новичков.
Это идет как это:
public static void main(String[] args) {
Dog aDog = new Dog("Max");
Dog oldDog = aDog;
// we pass the object to foo
foo(aDog);
// aDog variable is still pointing to the "Max" dog when foo(...) returns
aDog.getName().equals("Max"); // true
aDog.getName().equals("Fifi"); // false
aDog == oldDog; // true
}
public static void foo(Dog d) {
d.getName().equals("Max"); // true
// change d inside of foo() to point to a new Dog instance "Fifi"
d = new Dog("Fifi");
d.getName().equals("Fifi"); // true
}
В примере выше aDog.getName()
все еще возвратится "Max"
. Значение aDog
в main
не изменяется в функции foo
с Dog
"Fifi"
, когда ссылка на объект передается значением. Если бы это было передано ссылкой, то aDog.getName()
в [1 110] возвратился бы "Fifi"
после вызова к [1 112].
Аналогично:
public static void main(String[] args) {
Dog aDog = new Dog("Max");
Dog oldDog = aDog;
foo(aDog);
// when foo(...) returns, the name of the dog has been changed to "Fifi"
aDog.getName().equals("Fifi"); // true
// but it is still the same dog:
aDog == oldDog; // true
}
public static void foo(Dog d) {
d.getName().equals("Max"); // true
// this changes the name of d to be "Fifi"
d.setName("Fifi");
}
В вышеупомянутом примере, Fifi
имя собаки после вызова к [1 114], потому что имя объекта было определено в foo(...)
. Любые операции, который foo
работает на [1 117], таковы, что во всех практических целях они выполняются на [1 118], но не возможно изменить значение переменной aDog
самой.
BTW, an ASCII string is exactly the same in UTF-8 because they share the same first 127 characters; so "Hello" in ASCII is exactly the same as "Hello" in UTF-8, there's no conversion needed.
The collation in the table may be UTF-8 but you may not be fetching information from it in the same encoding. Now if you have trouble with information you give to pg_escape_string
it's probably because you're assuming content fetched from MySQL is encoded in UTF-8 while it's not. I suggest you look at this page on MySQL documentation and see the encoding of your connection; you're probably fetching from a table where the collation is UTF-8 but you're connection is something like Latin-1 (where special characters such as çéèêöà
etc won't be encoded in UTF-8).
Скорее всего, данные в вашей базе данных MySQL не UTF8. Это довольно распространенный сценарий. MySQL, по крайней мере, раньше не делал никакой надлежащей проверки данных, поэтому он принимал все, что вы бросали в него, как UTF8, если только ваш клиент утверждал, что это UTF8. Возможно, они уже исправили это (или нет, я не знаю, считают ли они это проблемой), но вы, возможно, уже неправильно закодировали данные в db. PostgreSQL, конечно, выполняет полную валидацию при загрузке, и, таким образом, может не получиться.
Возможно, вы захотите подать данные через что-то вроде iconv, что можно настроить на игнорирование неизвестных символов, или преобразовать их в "лучшие догадки".