У меня есть функция для параметризованных 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
в строке подключения. Все специальные символы, которые не обрезаны, превратятся в? хотя.