Параметризованная SQL функция обрезает переменные по специальным символам - PullRequest
1 голос
/ 07 февраля 2020

У меня есть функция для параметризованных SQL записей в ASP Classi c, которая прекрасно работает большую часть времени. Проблема в том, что он не обрабатывает специальные символы, такие как å, ä и ö. Он просто обрезает строку, где находятся эти символы. Я установил UTF-8 во всех ASP -файлах, связанных с кодовой страницей и набором кодировок, и в базе данных я использую UTF8mb4_unicode_ci и в некоторых случаях UTF8mb4_swedish_ci. UTF8 должен работать так, как задумано, и эта функция пока единственная, которая не справляется с этим. Я проверил, и параметр, который я отправляю, правильно содержит символы внутри функции, как до, так и после фактического выполнения.

Вот функция, которую я использую:

function dbPara(sqlPara, params)
dim cmd
set cmd = Server.CreateObject("ADODB.Command")
with cmd
    .CommandText = sqlPara
    set .ActiveConnection = cn
end with

if NOT isEmpty(params) then
    set rsPara = cmd.execute(, params)
else
    set rsPara = cmd.execute()
end if

response.write(params(0)) 'For test purpose only, this will output the entire string.

set dbPara = rsPara
end function

А вот код некорректно работающего примера, использующего функцию, и пример, работающий там, где она не параметризована:

Set cn = Server.CreateObject("ADODB.Connection")
cn.Open "Driver={MySQL ODBC 8.0 Unicode driver};Database="&db&";Server="&dbserver&";UID="&dbuser&";PWD="&dbpassword&""

comment = "This is a test to see if å is working properly."
sqlA = "UPDATE orders SET orders_comment = ? WHERE orders_id = 1234"
call dbPara(sqlA, array(comment))
'This will only set the orders_comment to everything up to the å

cn.execute("UPDATE orders SET orders_comment = '" & comment & "' WHERE orders_id = 1234)
'This will set the orders_comment correctly to the whole string

Может ли кто-нибудь увидеть какие-либо потенциальные проблемы с этой функцией, вызывающие такое поведение?

РЕДАКТИРОВАТЬ: добавление примера с более чем одной записью для объяснения моего комментария о первой переменной, в которой специальные символы заменены на?, Но вторая переменная получает свою запись обрезанной. Это когда я установил строку подключения для использования charset=utf8;, когда charset=ucs2;, как предложено Lankymark, не сработало:

    langSQL = "UPDATE faq_entry_lang SET faq_entry_lang_title = ?, faq_entry_lang_content = ? WHERE faq_entry_lang_entryID = ? AND faq_entry_lang_lang = ?"
    call dbPara(langSQL,array(faqtitle, faqcontent, entryid, lang))

РЕДАКТИРОВАТЬ 2: после дополнительного тестирования. Кажется случайным, когда отключается и когда не используется utf8 в строке подключения. Все специальные символы, которые не обрезаны, превратятся в? хотя.

1 Ответ

0 голосов
/ 08 февраля 2020

Пожалуйста, укажите SHOW CREATE PROCEDURE name

Затем посмотрите в конце - он скажет вам, что CHARACTER SET и COLLATION действовали, когда вы создавали про c (или FUNCTION) .

Я подозреваю, что это не то, что вам нужно. Исправление:

DROP PROCEDURE name;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;  -- (or whatever)
DELIMITER //
CREATE PROCEDURE
    ...... ;
//
DELIMITER ;

Дополнительные обсуждения: поиск слова «усечь» в Проблема с символами UTF-8; то, что я вижу, не то, что я сохранил

...