Сохранение акцентированных символов из скрипта PHP в Oracle DB - PullRequest
4 голосов
/ 24 августа 2010

я пытаюсь сохранить акцентированные символы (символы) в базу данных Oracle в поле VARCHAR2;я положил

<html>
<head>
   <meta http-equiv="Content-type" value="text/html; charset=utf-8">
</head>
<body>
<?php
 header('Content-type: text/html; charset=utf-8');

.... // и здесь я делаю вставку в БД:

$str=utf8_encode("JeanPièrre"); // or $str="JeanPièrre" ... is the same, it does not run
$sql="insert into TABLE(nvar) values('".$str."')";
$stmt = oci_parse($ora_conn, $sql) or die(oci_error().$query);
oci_execute($stmt);

Но акцентированный символ не сохраняется правильно, я вижу JeanPi?? rre

Что я могу сделать?Пожалуйста, помогите мне: - (

Заранее спасибо! C.

Ответы [ 7 ]

11 голосов
/ 24 августа 2010

Убедитесь, что ваши таблицы имеют набор символов UTF8 и убедитесь, что соединение с вашей базой данных использует UTF8.В поисках примера Oracle я нашел это:

resource oci_connect  ( string $username  , string $password  [, string $connection_string  [, string $character_set  [, int $session_mode  ]]] )

Что станет примерно таким:

$conn = oci_connect('insertUsername', 'insertPassword', 'insertHostname', 'AL32UTF8');

Полная документация:

http://nl3.php.net/oci_connect

1 голос
/ 27 августа 2010

Я решил свою проблему, добавив NLS_LANG = American_America.WE8ISO8859P1 в переменную ENV в файле /etc/init.d/apache2.

Это заставило PHP отправлять правильные символы в базу данных Oracle.

1 голос
/ 27 августа 2010

Какой у вас NLS_CHARACTERSET?(настройки прямо в базе).Значение может отличаться от NLS_LANG (отличается от кодировки при запуске клиента).Это значение, которое вы найдете, выполнит следующий запрос SQL:

SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS;

Вывод из моей базы данных выглядит следующим образом (мой NLS_CHARACTERSET = AL32UTF8):

SQL> col PARAMETER format a25
SQL> col VALUE format a50
SQL> SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS;

PARAMETER                 VALUE
------------------------- --------------------------------------------------
NLS_LANGUAGE              AMERICAN
NLS_TERRITORY             AMERICA
NLS_CURRENCY              $
NLS_ISO_CURRENCY          AMERICA
NLS_NUMERIC_CHARACTERS    .,
NLS_CHARACTERSET          AL32UTF8
NLS_CALENDAR              GREGORIAN
NLS_DATE_FORMAT           DD-MON-RR
NLS_DATE_LANGUAGE         AMERICAN
NLS_SORT                  BINARY
NLS_TIME_FORMAT           HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT      DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT        HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT   DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY         $
NLS_COMP                  BINARY
NLS_LENGTH_SEMANTICS      BYTE
NLS_NCHAR_CONV_EXCP       FALSE
NLS_NCHAR_CHARACTERSET    AL16UTF16
NLS_RDBMS_VERSION         9.2.0.6.0

20 rows selected.

Проблема может быть либо с кодировкойнастройки вашего клиента (я имею в виду не PHP-функцию "utf8_encode", а действительно кодирующую вашу рабочую станцию, на которой выполняется скрипт).Или это другая база данных кодировки и значение NLS_CHARACTERSET.

Вероятно, идентичная проблема описана на этой странице:

http://www.databaseanswers.org/ora_nls_support.htm

0 голосов
/ 30 марта 2015

Я изменил настройку в файле php.ini, и это сработало.В php.ini

mbstring.internal_encoding = UTF-8;
должно быть включено следующее
0 голосов
/ 17 июня 2014

У меня была такая же проблема, и я исправил ее с помощью utf8_decode ();

    $textForDB = utf8_decode("Áà");
0 голосов
/ 27 августа 2010

Я обеспокоен этой строкой.

$sql="insert into TABLE(nvar) values('".$str."')";

Вместо привязки строкового значения через переменную, оно просто объединяет его во вставке. Это плохая практика в Oracle. Пример использования привязки:

$sql = "insert into TABLE(nvar) values( :str )";
$stmt = oci_parse($ora_conn, $sql) or die(oci_error().$query);
ocibindbyname($stmt,":str",&$str,6);
oci_execute($stmt);

Так что я бы начал с исправления. Есть небольшой шанс, что исправит ошибку. Здесь упоминается здесь , но это не совсем понятно. По сути, это означает, что есть некоторая разница в отношении литералов между

INSERT INTO table VALUES ('è');

и

INSERT INTO table VALUES (N'è');
0 голосов
/ 26 августа 2010

Если ваш исходный файл, который имеет эту строку:

$str=utf8_encode("JeanPièrre");

уже закодировано в UTF-8 (я имею в виду просто файл), тогда вам не нужно кодировать "JeanPièrre", потому что оно уже в UTF-8.

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

Помните, что метатег и тип кодировки файла не совпадают. Вы можете проверять и конвертировать ваши файлы многими программами, см. Notepad ++, вам следует работать с кодировкой «UTF-8 без BOM».

Также убедитесь, что ваша БД / таблица / соединение настроены на UTF-8, если у них есть такая опция.

Проверьте также способ получения данных из базы данных - возможно, вставка в порядке, но символы не работают при запросе для извлечения данных.

...