แบบสอบถามฐานข้อมูลไม่ส่งคืนสตริงเต็ม

ฉันกำลังบันทึกสตริง json ในฐานข้อมูลซึ่งดูเหมือนว่าจะจัดเก็บอย่างถูกต้องใน SQL Server แต่เมื่อพยายามดึงข้อมูลจะส่งคืนเพียงส่วนหนึ่งของสตริง json เท่านั้น

ฉันใช้ PDO และ json_encode เพื่อบันทึกข้อมูล สตริง json ที่เก็บไว้มีความยาวประมาณ 1,000 อักขระ และฟิลด์ตารางอนุญาตให้มีความยาวได้ 4,096 ตัว

กำลังดึงผลลัพธ์:

$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);

การบันทึกผลลัพธ์:

$json = json_encode($_POST);

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

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

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

ตัวอย่าง Json ที่เก็บไว้ใน SQL Server:

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

ตัวอย่าง Json ที่ส่งคืน:

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

อัปเดต

ดูเหมือนว่าความยาวของสตริงที่ส่งคืนจะเป็นเสมอ: 255

นี่อาจเป็นการกำหนดค่า SQL Server หรืออาจเป็น PDO


person iswinky    schedule 11.11.2015    source แหล่งที่มา
comment
คุณแน่ใจหรือไม่ว่าสตริงไม่ยาวเกินขีดจำกัดของฐานข้อมูล echo strlen($json);   -  person Steve    schedule 11.11.2015
comment
การเข้ารหัสบนโต๊ะ/ฟิลด์คืออะไร ฉันคิดว่านี่อาจเป็นปัญหาการเข้ารหัส โดยที่คุณกำลังนับอักขระเทียบกับไบต์   -  person Jake Bathman    schedule 11.11.2015
comment
@Steve ความยาวสตริงคือ 894 ขีด จำกัด ของฐานข้อมูลคือ 4096   -  person iswinky    schedule 11.11.2015
comment
@เจคบี. การจัดเรียงตารางคือ SQL_Latin1_General_CP1_CI_AS   -  person iswinky    schedule 11.11.2015
comment
ฟิลด์นี้ใช้ VARCHAR เป็นประเภทหรือไม่   -  person Jake Bathman    schedule 11.11.2015
comment
และ/หรือเป็นแถวใหญ่อื่นๆ ในตาราง? สุดท้าย: คุณสามารถยืนยันได้ว่าสตริงต้นฉบับถูกเก็บไว้เต็มหรือถูกตัดทอนเมื่อแทรกหรือไม่   -  person Jake Bathman    schedule 11.11.2015
comment
โปรดทราบว่าคุณควรใช้การเข้ารหัส UTF-8 สำหรับฟิลด์ใดๆ ที่คุณจะจัดเก็บ JSON ตามคำจำกัดความ JSON คือการใช้การเข้ารหัส Unicode   -  person Mike Brant    schedule 11.11.2015
comment
@เจคบี. มันคือ varchar(4096) นี่คือแถวที่ใหญ่ที่สุดจนถึงตอนนี้ ส่วนคอลัมน์อื่นคือ ld และดูเหมือนว่าจะเก็บไว้เต็มเลย ถ้าผมดูใน SQL Server ก็มีทั้งหมดนั่นแหละ   -  person iswinky    schedule 11.11.2015
comment
@MikeBrant ฉันได้ลองเรียกใช้ข้อมูลทั้งหมดผ่าน utf8_encode() ก่อนที่จะใช้ json_encode() แต่ฉันยังไม่มีโชค   -  person iswinky    schedule 12.11.2015
comment
@MikeBrant ดูการอัปเดต   -  person iswinky    schedule 12.11.2015


คำตอบ (2)


ปรากฎว่าโปรโตคอลที่ฉันใช้เชื่อมต่อกับ SQL Server ผ่าน PDO จำกัดไว้ที่ 255 อักขระเมื่อดึงข้อมูลจากคอลัมน์ varchar

วิธีแก้ปัญหาคือเปลี่ยนคอลัมน์เป็น TEXT หรือแปลงเป็นข้อความใน SQL

SELECT CAST(my_column as TEXT)

แบบสอบถาม ODBC บน MS SQL Server ส่งคืนอักขระ 255 ตัวแรกเฉพาะใน PHP PDO (FreeTDS)

person iswinky    schedule 12.11.2015
comment
ดีใจที่คุณเข้าใจมันแล้ว ช่างเป็นการตั้งค่าที่แปลกมาก - person Jake Bathman; 12.11.2015
comment
@เจคบี. ใช่ ฉันรู้น่าหงุดหงิด! ขอบคุณสำหรับความช่วยเหลืออยู่ดี - person iswinky; 12.11.2015

แก้ไข: ดูเหมือนว่าปัญหาของ OP จะเป็นอย่างอื่น แต่ฉันจะทิ้งสิ่งนี้ไว้ด้านล่างสำหรับบุคคลในอนาคตที่อาจมีปัญหาคล้ายกัน ซึ่งสามารถแก้ไขได้โดยดูที่ TEXTSIZE


ดูเหมือนว่าปัญหาอาจเกิดจากตัวแปร TEXTSIZE ใน SQL Server ซึ่งจำกัดความยาวของข้อความที่ส่งคืนผ่าน PHP

ดูว่าปัจจุบันใช้ค่าอะไรอยู่

SELECT @@TEXTSIZE

และอัปเดตเป็นค่าที่สูงขึ้นโดยใช้

SET TEXTSIZE 2147483647

โดยที่ตัวเลขคือจำนวนอักขระสูงสุด (ค่าเริ่มต้นเป็น/สูงสุดที่ค่าด้านบน)

นี่คือหน้า MSDN บน TEXTSIZE: https://msdn.microsoft.com/en-us/library/ms186238.aspx

person Jake Bathman    schedule 11.11.2015
comment
ตั้งค่าเป็น 2147483647 แล้ว ซึ่งเทียบเท่ากับประมาณ 2GB สตริง json ที่กำลังบันทึก / ดึงข้อมูลไม่ได้อยู่ใกล้ขนาดนั้น มีความยาวสตริง 894 และขนาดประมาณ 1.04KB ฉันคิดว่ามันต้องเป็นวิธีการจัดเก็บ - person iswinky; 12.11.2015