PHP-скрипт усекает текстовое поле до 4096 символов при подключении к SQL Server 2005 и 2016 через ODBC / FreeTDS - PullRequest
2 голосов
/ 01 мая 2019

Я использую FreeTDS / ODBC для подключения к базе данных SQLServer2005 из CentOS7 с использованием PHP.Он работает хорошо, за исключением одного поля - большого текстового поля «заметка», которое усекается до 4096 символов.Как получить запрос PHP odbc_exec для извлечения всего текстового поля?

Я в процессе переноса базы данных из SQLServer2005 в SQLServer2016, но проблема с усечением текстового поля, похоже, одинакова для обоих.

Я попытался установить размер текста в самом запросе:

SET TEXTSIZE 2147483647; SELECT note FROM soap WHERE organizationId=41 and patientId=2019 AND noteId=189

Я протестировал вышеупомянутое соединение и запрос в isql с моими настройками odbc / freetds, и он, похоже, получает всетекстовое поле правильно.Вот часть вывода из моего файла freetds.log:

17:30:50.367355 29543 (token.c:1542):tds7_get_data_info:
        colname = note
        type = 35 (text)
        server's type = 35 (text)
        column_varint_size = 4
        column_size = 2147483647 (2147483647 on server)

Я попытался установить размер текста в файле odbc.ini:

[ClaimsServiceNewTest]
Driver                  = /usr/lib64/libtdsodbc.so.0
Description             = Advanced Billing Service Database (TESTING OLD SQL)
Trace                   = Yes
TraceFile               =/tmp/sql.log
ForceTrace              = Yes
SERVERNAME              = ClaimsServiceNewTest
User                    = ********
Password                = ********
Database                = ********
Port                    = 1433
TDS_Version             = 7.1
TextSize                = 2147483647

Я также установил текстразмер в файле freetds.conf:

 # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.
        # Try setting 'text size' to a more reasonable limit
        text size = 4294967295 

Только когда я пытаюсь выполнить запрос в моем PHP-скрипте, он усекается.

Есть предложения?Я довольно новичок во всем этом, поэтому, пожалуйста, дайте мне знать, если я упускаю что-то очевидное.Я также заметил, что isql выводит TDSDUMP в мой файл freetds.log, но мои запросы PHP - нет - я не знаю, является ли это ожидаемым поведением, но если у вас есть предложения по выводу TDSDUMP из моих запросов PHP, я представляючто у него будет дополнительная полезная информация.

Спасибо за внимание!

РЕДАКТИРОВАТЬ: Одно замечательное предложение Mark Thomas состояло в том, чтобы изменить mssql.textlimit и mssql.textsizeв php.ini.Я изменил это в файле php.ini (а также сделал это в скрипте с помощью: ini_set('mssql.textlimit', 10000000);, но я не вижу, чтобы это имело значение (перезапуск apache после изменений в php.ini должен быть достаточным,верно?).

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Благодаря ответу Марка Томаса я смог (в конце концов) найти решение.В php.ini обработку полей LONG в ODBC необходимо было изменить со значения по умолчанию odbc.defaultlrl = 4096 на более высокое значение - я использовал odbc.defaultlrl = 2000000

Проблема решена!

Еще раз спасибо за всю помощь и указание мне в правильных направлениях.

0 голосов
/ 01 мая 2019

Я немного устала от PHP, но я думаю, что есть ограничение по умолчанию, которое может вступить в действие при подключении к определенным типам данных, как в вашем примере.

Эта предыдущая публикация здесь обсуждает это и предлагает решение, которое может помочь, проверив значение по умолчанию в файле php.ini для размеров текстового файла mssql: Ограничение количества символов в тексте mssql_fetch_object?

...