Привет Я пытаюсь хранить имена в базе данных Oracle и извлекать их с помощью PHP и oci8.Работа с eacute и другими специальными символами с использованием Oracle, PHP и Oci8
Однако, если я вставляю é
непосредственно в базу данных Oracle и использовать oci8, чтобы принести его назад, я просто получите e
ли я кодировать все специальные символы (включая é
) в HTML лиц (то есть: é
) перед вставкой в базу данных ... или я чего-то не хватает?
Thx
UPDATE: Мар 1 в 18:40
нашел эту функцию: http://www.php.net/manual/en/function.utf8-decode.php#85034
function charset_decode_utf_8($string) {
if(@!ereg("[\200-\237]",$string) && @!ereg("[\241-\377]",$string)) {
return $string;
}
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e","'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",$string);
$string = preg_replace("/([\300-\337])([\200-\277])/e","'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",$string);
return $string;
}
, кажется, работает, хотя и не уверен, что если его оптимальное решение
UPDATE: 8 мар в 15:45
набора символов Oracle является ISO-8859-1.
в PHP Я добавил:
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
, чтобы заставить соединение oci8 использовать этот набор символов. Получение é
с использованием oci8 с PHP теперь сработало! (Для varchars
, но не CLOBs
должен был сделать utf8_encode
, чтобы извлечь его)
Затем я попытался сохранить данные из PHP в Oracle ... и оно не work..somewhere по пути из PHP в оракул é
становится ?
UPDATE: 9 мар в 14:47
Так ближе. После добавления переменной NLS_LANG выполняются прямые вставки oci8 с é
.
Проблема на самом деле на стороне PHP. Используя структуру ExtJs, при отправке формы она кодирует ее с использованием encodeURIComponent
.
Так é
отправлено как %C3%A9
, а затем перекодировано в é
.
Однако его длина теперь (strlen($my_sent_value) = 2)
и не 1. И если в PHP я пытаюсь: $ my_sent_value == é
= FALSE
Я думаю, если я могу перекодировать все эти символы в PHP возвращается в длину байта размером 1, а затем вставляя их в Oracle, он должен работать.
Еще не повезло, хотя
UPDATE: 10 мар в 11:05
Я продолжаю думать, что я так близко (но так далеко).
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
работает очень спорадически.
Я создал небольшой скрипт для проверки:
header('Content-Type: text/plain; charset=ISO-8859-1');
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
$conn= oci_connect("user", "pass", "DB");
$stmt = oci_parse($conn, "UPDATE temp_tb SET string_field = '|é|'");
oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);
После запуска один раз и Логгина в базу данных Oracle непосредственно я вижу, что STRING_FIELD установлен в |¿|
. Очевидно, не то, что я ожидал от своего предыдущего опыта.
Однако, если я обновляю эту страницу PHP дважды быстро ... это сработало !!!
В Oracle я правильно увидел |é|
.
Похоже, что переменная окружения не была правильно установлена или отправлена во время первого выполнения скрипта, но доступна для второго выполнения.
Мой следующий эксперимент заключается в том, чтобы экспортировать переменную в среду PHP, однако мне нужно сбросить Apache для этого ... поэтому мы посмотрим, что произойдет, надеюсь, это сработает.
Какой набор символов является база данных в? Вы можете использовать 'select property_value from database_properties, где property_name = 'NLS_CHARACTERSET'; чтобы узнать. ' –
вы можете ответить на свой вопрос;) –
Я бы подождал, отвечая на вопрос самостоятельно, все еще могут быть лучшие способы сделать это ... –