Oracle arka uçlu (OCI8 işlevleri) PHP uygulamalı bir uygulama yapıyorum. Uygulama, Oracle 10g XE ile geliştirildi ve müşterinin sahip olduğu herhangi bir sürümde konuşlandırıldı.CHAR semantics ve ORA-01461
uygulama tek baytlık metin (ISO-8859-15) kolları ve Oracle XE Batı Avrupa baskısında karşı gelişen ederken herhangi bir sorun olmadı. Ancak, yakın zamanda Universal sürümünü yükledim ve ASCII olmayan karakterlerle geniş dizeleri eklerken sorun yaşıyorum. Bu versiyon NLS_CHARACTERSET = AL32UTF8
; Uygulamamın WE8ISO8859P15
Oracle kullanmasını sağladığımdan, giriş verilerimi ISO-8859-15'ten UTF-8'e dönüştürüyor (bu da gayet iyi). Ancak bazı boyut denetimlerinin yanlış gittiği görülüyor: 1500 €
karakterli bir dize (ISO-8889-15'te 1500 bayt, UTF-8'de 4500 bayt) bir VARCHAR2(4000 CHAR)
sütununda taşıyor gibi görünüyor.
Ben bu test tablo oluşturduk:
CREATE TABLE FOO (
FOO_ID NUMBER NOT NULL ENABLE,
DATA_BYTE VARCHAR2(4000 BYTE),
DATA_CHAR VARCHAR2(4000 CHAR),
CONSTRAINT FOO_PK PRIMARY KEY (FOO_ID)
);
sorun bu kodla yeniden olabilir
:
<?php
$connection = oci_connect(DB_USER, DB_PASS, DB_CONN_STRING, 'WE8ISO8859P15');
if(!$connection){
$e = oci_error();
die(htmlspecialchars($e['message']));
}
$id = 1;
$data = str_repeat('€', 1500);
$sql = 'INSERT INTO FOO (FOO_ID, DATA_CHAR) ' .
'VALUES (:id, :data)';
$res = oci_parse($connection, $sql);
if(!$res){
$e = oci_error();
die(htmlspecialchars($e['message']));
}
if(!oci_bind_by_name($res, ':id', $id)){
$e = oci_error();
die(htmlspecialchars($e['message']));
}
if(!oci_bind_by_name($res, ':data', $data)){
$e = oci_error();
die(htmlspecialchars($e['message']));
}
if(!oci_execute($res, OCI_COMMIT_ON_SUCCESS)){
$e = oci_error();
die(htmlspecialchars($e['message']));
}
... tetikler:
Uyarı: oci_execute(): ORA-01461: Ürün detayları Ürün numarası Dökümanlar LONG para insertarlo en una columna UZUN
4001 karakter dizisi eklemeye çalıştığımda aldığım hata da aynı. Bunun yerine €€€
ait xxx...
eklemek eğer olmaz ve ben UTF-8 olarak benim komut kaydetmek durumunda ne ve bu şekilde bağlamak değildir:
<?php
$connection = oci_connect(DB_USER, DB_PASS, DB_CONN_STRING, 'AL32UTF8');
[Güncelleme: Testim kusurlu oldu . UTF-8 kullanmak ORA-01461'den kaçınmaz]
Bu sorunu nasıl geçersiz kılabilirim? NLS_CHARACTERSET veritabanı parametresi, numaralı telefonu denetlediğim ve uygulamanızı UTF-8 olarak değiştirdiğim bir şey değil, başka sorunlara da neden olabilir (neredeyse tüm müşterilerimiz tek bayt veritabanlarına sahiptir).
Haklısınız, UTF-8 test komut dosyasında bir hata oluştu: ORA-01461'i de tetikliyor. VARCHAR2 (4000 CHAR) '4000 * bayttan fazla * tutamayacak gibi görünüyor. Sütun boyutunu düşürüp düşürmeyeceğinizi ya da 'CLOB '' a geçip geçmeyeceğimi inceleyeceğim. –
Bazı referanslar buldum: "VARCHAR2 sütunu olan bir tablo oluşturduğunuzda, VARCHAR2 sütunu için 1 ve 4000 ** bayt ** arasında bir maksimum dize uzunluğunu (bayt veya karakter olarak) belirtirsiniz." - http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#sthref3780 –
Alternatif bir sabit bayt karakter takımı kullanarak sorunu en aza indirgeyebilirsiniz. Örneğin JA16SJIS, Japonca karakterler için iki bayt kullanır ve TH8TISASCII, tek baytlık bir Thai karakter kümesidir –