Kueri basis data tidak mengembalikan string lengkap

Saya menyimpan string json di database yang tampaknya disimpan dengan benar di SQL Server, namun ketika mencoba mengambil data, ia hanya mengembalikan sebagian dari string json.

Saya menggunakan PDO dan json_encode untuk menyimpan data. String json yang disimpan panjangnya sekitar 1000 karakter, dan bidang tabel mengizinkan panjangnya 4096.

Mengambil hasil:

$sql = "SELECT TOP 1 * FROM MyTable WHERE id = :id ORDER BY id DESC;";

$params = array(
    ":id" => $id
);

$sth = $this->db->prepare($sql);
$sth->execute($params);
$result = $sth->fetch(PDO::FETCH_ASSOC);

Menyimpan hasil:

$json = json_encode($_POST);

$sql = "INSERT INTO MyTable(data) VALUES (:data);";

$params = array(
    ":data" => $data
);

$stmt = $this->db->prepare($sql);
$stmt->execute($params);

Contoh Json yang disimpan di SQL Server:

{  
    "checkbox_1":"on",
    "checkbox_2":"on",
    "checkbox_3":"on",
    "text_1":"my text",
    "images":[  
        13685
    ],
    "date":"11-11-2015"
}

Contoh Json dikembalikan:

{  
    "checkbox_1":"on",
    "checkbox_2":"on",
    "checkbox_3":"on",
    "text_1

Perbarui

Tampaknya panjang string yang dikembalikan selalu: 255

Mungkinkah ini konfigurasi SQL Server atau mungkin PDO?


person iswinky    schedule 11.11.2015    source sumber
comment
Apakah Anda yakin stringnya tidak lebih panjang dari batas database? echo strlen($json);   -  person Steve    schedule 11.11.2015
comment
Apa pengkodean pada tabel/bidang? Saya pikir ini mungkin masalah penyandian, saat Anda menghitung karakter versus byte.   -  person Jake Bathman    schedule 11.11.2015
comment
@Steve panjang string adalah 894, batas database adalah 4096   -  person iswinky    schedule 11.11.2015
comment
@JakeB. Susunan tabelnya adalah SQL_Latin1_General_CP1_CI_AS.   -  person iswinky    schedule 11.11.2015
comment
Apakah bidang tersebut menggunakan VARCHAR sebagai tipenya?   -  person Jake Bathman    schedule 11.11.2015
comment
Dan/atau apakah baris besar lainnya ada di tabel? Terakhir: dapatkah Anda memverifikasi bahwa string asli disimpan secara lengkap, atau terpotong saat dimasukkan?   -  person Jake Bathman    schedule 11.11.2015
comment
Perhatikan bahwa Anda harus menggunakan pengkodean UTF-8 untuk bidang apa pun di mana Anda akan menyimpan JSON, menurut definisi JSON adalah menggunakan pengkodean Unicode.   -  person Mike Brant    schedule 11.11.2015
comment
@JakeB. Ini adalah varchar(4096), ini adalah baris terbesar sejauh ini, satu-satunya kolom lainnya adalah ld. Dan sepertinya tersimpan lengkap, kalau saya lihat di SQL Server, semua ada   -  person iswinky    schedule 11.11.2015
comment
@MikeBrant Saya sudah mencoba menjalankan semua data melalui utf8_encode() sebelum menggunakan json_encode() tetapi saya masih belum berhasil   -  person iswinky    schedule 12.11.2015
comment
@MikeBrant Lihat pembaruan   -  person iswinky    schedule 12.11.2015


Jawaban (2)


Ternyata protokol yang saya gunakan untuk terhubung ke SQL Server melalui PDO membatasi hingga 255 karakter saat mengambil dari kolom varchar.

Solusinya adalah dengan mengubah kolom menjadi TEXT atau mengubahnya menjadi teks di SQL

SELECT CAST(my_column as TEXT)

kueri ODBC di MS SQL Server mengembalikan 255 karakter pertama hanya di PHP PDO (FreeTDS)

person iswinky    schedule 12.11.2015
comment
Senang Anda berhasil mengetahuinya. Pengaturan yang aneh. - person Jake Bathman; 12.11.2015
comment
@JakeB. Ya, saya tahu, membuat frustrasi! Terima kasih atas bantuannya - person iswinky; 12.11.2015

Sunting: Sepertinya masalah OP adalah masalah lain, namun saya akan tinggalkan ini di bawah untuk orang-orang di masa mendatang yang mungkin memiliki masalah serupa, yang dapat diselesaikan dengan mencari TEXTSIZE.


Sepertinya masalahnya mungkin ada pada variabel TEXTSIZE di SQL Server, yang membatasi panjang teks yang dikembalikan melalui PHP.

Lihat apa yang digunakan nilai saat ini

SELECT @@TEXTSIZE

dan perbarui ke nilai yang lebih tinggi menggunakan

SET TEXTSIZE 2147483647

Dimana angka tersebut adalah jumlah karakter maksimal (defaultnya/maksimum pada nilai di atas).

Berikut halaman MSDN di TEXTSIZE: https://msdn.microsoft.com/en-us/library/ms186238.aspx

person Jake Bathman    schedule 11.11.2015
comment
Ini sudah disetel ke 2147483647, yang setara dengan sekitar 2 GB. String json yang disimpan/diambil tidak mendekati ukuran itu. Ini memiliki panjang string 894, dan ukurannya kira-kira 1,04KB. Saya pikir itu pasti cara penyimpanannya. - person iswinky; 12.11.2015