VARCHAR поля тянулись до 255 символов

Я использую PHP, SQL Server 2012 и FreeTDS. С версией TDS = 7.4 все мои поля VARCHAR усекаются до 255 символов.

Я читал, что это происходит с версиями TDS менее 7.0, так что это не относится к этой конфигурации.

Это работало правильно, когда мы использовали TDS версии 7.1, но наш хостинг-провайдер, похоже, что-то изменил (все еще работает над выяснением этого), и теперь мы по какой-то причине не можем подключиться к 7.1.

Вот вывод tsql -C:

Настройки времени компиляции (устанавливаются с помощью скрипта configure)
                            Версия: freetds v1.00.27
             Каталог freetds.conf: /usr/local/etc
     Совместимость с MS db-lib: нет
        Бинарная совместимость Sybase: нет
                      Безопасность потока: да
                      Библиотека iconv: да
                        Версия TDS: авто
                              iODBC: нет
                           unixodbc: да
              SSPI "доверенные" логины: нет
                           Kerberos: нет
                            OpenSSL: да
                             GnuTLS: нет
                               МАРС: нет

А вот мой freetds.conf:

[Глобальный]
    версия tds = 7.4
    размер текста = 2147483647

[Имя-сервера-мой]
    host = my-server-name
    порт = 1433
    версия tds = 7.4
    instance = my-db-instance

Я подключаюсь через PHP (используя старый mssql_* функции), используя то же значение, которое я использовал для my-server-name, Я подтвердил, что он использует эту конфигурацию, изменив tds version до 7.1, с которой не работает соединение.

Ранее я использовал freetds v0.91, и я скачал последнюю стабильную версию и следовал инструкциям по сборке на их веб-сайте для обновления, но это не помогло.

В этой базе кода очень много таблиц, запросов, хранимых процедур и функций, поэтому обновите все вызовы этих полей VARCHAR, чтобы использовать что-то вроде CAST(column AS TEXT) это не вариант.

Пример кода, который показывает проблему для меня, выглядит следующим образом:

<?php
$conn = mssql_connect('my-server-name', 'my-username', 'my-password');
mssql_select_db('my-database', $conn);
$result = mssql_query("SELECT longFieldName FROM myTable");
while ($row = mssql_fetch_array($result, MSSQL_ASSOC)) {
    var_dump($row);
}

И это извлечение из таблицы, которая была создана как:

CREATE TABLE myTable (longFieldName VARCHAR(2000));
INSERT INTO myTable (longFieldName) VALUES ('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');

Когда я запускаю код PHP, я ожидаю, что будет сброшена полная строка, но вместо этого она выдает следующую строку:

array(1) {
  'longFieldName' =>
  string(255) "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor i"
}

Что вызывает усечение этих полей до 255 символов?


РЕДАКТИРОВАТЬ:

Похоже, это может быть характерно для PHP. Я пытался подключиться с помощью tsql и я сделал запрос и получил полную строку обратно. Я использую PHP 5.5.15 (cli), я настроил xdebug со следующей конфигурацией:

[xdebug]
zend_extension="/usr/local/lib/xdebug.so"
xdebug.var_display_max_children = -1
xdebug.var_display_max_data = -1
xdebug.var_display_max_depth = -1
xdebug.remote_port = 9000
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1

И следующая конфигурация MSSQL:

[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.connect_timeout = 5
mssql.timeout = 6000000000
mssql.textsize = 2147483647
mssql.secure_connection = Off

ОБНОВИТЬ:

Я не вижу этой проблемы с версией 7.0. Итак, подведем итог, что происходит с каждой версией:

  • 7.0: Возможность подключения и поля varchar не усекаются, но не поддерживают 64-битные целые числа.
  • 7.1: не удается подключиться ( это отдельная проблема). Когда мы смогли подключиться в прошлом, у нас не было проблемы с усечением.
  • 7.2 и выше: Возможность подключения, но поля varchar усекаются.

1 ответ

Я думаю, что я выяснил проблему усечения.

Пока я пытался обновить свою версию FreeTDS, я фактически установил вторую версию FreeTDS, и именно это использовалось для tsql -C, Но когда я включил регистрацию, установив dump file = /tmp/freetds.log в моем freetds.conf, а затем запустил тест и посмотрел журнал, первая строка говорит:

Начальный лог-файл для FreeTDS 0.91

Таким образом, PHP фактически использует FreeTDS версии 0.91. И согласно этому ответу, 0.91 поддерживает только до версии TDS 7.2.

Поэтому, когда я указал 7.3 или 7.4, я считаю, что по умолчанию использовалась более старая версия, что подтверждается другой строкой ниже в файле журнала:

Подключение к 172.19.4.129 порту 1433 (TDS версия 4.2)

Так что это причина проблемы усечения. Мне придется обновить мою версию FreeTDS, которую использует PHP.

Другие вопросы по тегам