cf10 проблема с cfquery maxrows

Я недавно перенес приложение с cf9 на cf10

При выполнении запроса с установленным maxrows я получаю следующую ошибку:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=1000' at line 1

Запрос работает нормально на cf9 и cf8.

Немного поигравшись, похоже, что cf10 добавляет к запросу OPTION SQL_SELECT_LIMIT=1000;, но mySQL не распознает его. Если я уберу параметр maxrows из запроса, он будет работать нормально.

Также стоит отметить, что запрос имеет два внешних соединения.

Кто-нибудь еще сталкивался с подобными проблемами при переходе на cf10?

Спасибо заранее за любые советы

Вот полный запрос

<cfquery name="details" datasource="#Application.ds#" maxrows="#arguments.maxrows#">
          SELECT b.booking_id,
                    DATEDIFF(b.check_out,b.check_in) as nights,
                    b.package_id,
                    b.beds_cot,
                    b.date_booked,
                    b.beds_king,
                    b.status,
                    b.tstamp as booking_tstamp,
                    g.ext_ref_id as guest_ext_ref_id,
                    g.title,
                    g.first_name,
                    g.surname,
                    g.full_name,
                    g.tstamp as guest_tstamp,
                    r.room_id,
                    r.ext_ref_id as room_ext_ref_id,
                    r.name as room_name,
                    r.description as room_description,
                    p.package_id,
                    p.ext_ref_id as package_ext_ref_id,
                    p.name as package_name,
                    p.description as package_description,
                    p.date_start as pacakge_date_start,
                    p.date_end as package_date_end

          FROM guest_booking as b 
          JOIN guest as g
          LEFT JOIN room as r ON b.room_id = r.room_id
          LEFT JOIN packages as p on b.package_id = p.package_id

          WHERE b.provider_id = #arguments.provider_id#
            and b.guest_id = g.guest_id
          <cfif isdefined("arguments.status")>
              and b.status = #arguments.status#
          </cfif>
          <cfif isdefined("arguments.booking_id")>
              and b.booking_id = #arguments.booking_id#
          </cfif>

          ORDER BY #arguments.order_by#
        </cfquery>

person Jason    schedule 20.08.2012    source источник
comment
Не уверен, почему это происходит, но в качестве альтернативы вы можете найти предложение mySQL LIMIT. Подробнее здесь: dev.mysql.com/doc/refman/5.0/en /select.html   -  person Sam Farmer    schedule 20.08.2012
comment
Похоже на несовместимость между версией драйвера и версией MySQL? Я бы, вероятно, просто использовал LIMIT, как предлагает Сэм, вместо того, чтобы пытаться беспокоиться об этом.   -  person Peter Boughton    schedule 20.08.2012
comment
Спасибо, Сэм. LIMIT, как вы предложили, работает нормально. Работает для меня двигаться вперед, а также. Если я не получил прямого решения проблемы, описанной в течение дня или около того, отправьте сообщение как ответ, и я могу отметить его как таковой. Спасибо еще раз!   -  person Jason    schedule 20.08.2012
comment
@ Джейсон - я думаю, что предложение Сэма тоже хорошее решение. FWIW Я подозреваю, что Питер прав в том, что это несовместимость версий, потому что он отлично работал для меня MySQL (4/5) и MySQL 5.1.62+.   -  person Leigh    schedule 20.08.2012
comment
В настоящее время я работаю на mysql (4/5) и mySQL5.6.5. Я предполагаю, что драйвер, который поставляется с cf10, является последним, а mySQL 5.6.5 довольно свеж. Еще раз всем спасибо!   -  person Jason    schedule 21.08.2012
comment
Если у меня будет шанс, я попробую это с 5.6 позже, чтобы увидеть, отличаются ли мои результаты.   -  person Leigh    schedule 21.08.2012
comment
@ Сэм Фармер. Не могли бы вы опубликовать свой комментарий в качестве ответа, и я могу отметить его как ответ. Спасибо.   -  person Jason    schedule 22.08.2012
comment
Эта проблема вновь всплыла передо мной. Я попытался установить плагин Mura и получил эту ошибку. Это чистая установка Mura с загруженным плагином. Все работает нормально, если я устанавливаю на Windows/cf9, но я получаю эту ошибку на OSX/cf10. Я до сих пор не могу найти ничего об этом в Интернете .. у кого-нибудь есть идеи? Спасибо   -  person Jason    schedule 01.10.2012


Ответы (2)


Не уверен, почему это происходит, но вы можете найти предложение mySQL LIMIT в качестве альтернативы. Подробнее здесь: http://dev.mysql.com/doc/refman/5.0/en/select.html

person Sam Farmer    schedule 22.08.2012

Я всегда избегал Maxrows.

Я не уверен, как ColdFusion справляется с этим, но я помню, как слышал (по крайней мере, когда существовал CF7), что CF на самом деле получает больший набор данных, а затем разбивает его на уровне сервера CF, а НЕ на уровне базы данных SQL. Как вы понимаете, это может привести к нежелательному снижению производительности.

Я не уверен, в чем именно заключается ваша проблема (мне кажется, что это ошибка), но я настоятельно рекомендую заменить атрибут maxrows комбинацией предложений LIMIT и OFFSET в вашем SQL (cfquery).

Преимущество заключается в том, что это стандартный SQL, который в любом случае может работать быстрее, чем CF maxrows, а также устраняет вашу проблему.

person Michael Giovanni Pumo    schedule 21.08.2012
comment
Да, я считаю, что это было правдой в ранних версиях. Однако их сообщение об ошибке предполагает, что CF10 ограничивает записи на стороне базы данных, как это делает LIMIT. Но если поведение не задокументировано, я согласен с использованием LIMIT, как предлагал ранее Сэм. Тем не менее интересно видеть, что maxrows немного умнее, чем я думал ;-) - person Leigh; 21.08.2012
comment
Ах, хорошая мысль! Кажется, это была бы хорошая функция на самом деле. Никогда не использую его сам. - person Michael Giovanni Pumo; 22.08.2012
comment
(Редактировать) Если бы это было последовательно и задокументировано, да. Поскольку я никогда не уверен, выполняется ли maxrows в базе данных или в CF, от одной версии к другой, LIMIT, вероятно, является более безопасным выбором ;-) - person Leigh; 22.08.2012