ColdFusion — вставка арабских/персидских символов в mysql

Я вставляю свои данные в базу данных mysql с помощью этого кода:

<cfprocessingdirective pageEncoding="utf-8">     
<cfset setEncoding("URL", "utf-8")>
<cfset setEncoding("Form", "utf-8")> 
<cfcontent type="text/html; charset=utf-8">

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body> 

<cfparam name="postTextBox" default="" type="String">

<cfoutput>
    <form action="index.cfm" method="POST" name="form">
        <input name="postTextBox" type="text"/>
        <input name="" type="submit" value="Submit" />
    </form>
</cfoutput> 

<cfquery name="myQuery" datasource="hello">
    insert into ad (name)  
    values(N<cfqueryparam value=#postTextBox# cfsqltype="cf_sql_varchar">)
</cfquery>

</body> 
</html>

Проблема в том, что когда я вставляю арабские или персидские символы, которые хранятся в базе данных, что-то вроде "?????" но с английскими иероглифами проблем нет. Я использую ColdFusion 10 и mysql.

С Уважением


person Morteza    schedule 16.09.2014    source источник
comment
Проверьте Name кодировку столбца. Убедитесь, что он поддерживает, например, арабский и персидский языки, т.е. create table ( name varchar(500) CHARSET UTF8, ....). Кроме того, попробуйте использовать <cfqueryparam cfsqltype="cf_sql_nvarchar" ...›` вместо N и cf_sql_varchar.   -  person Leigh    schedule 16.09.2014
comment
@Ли Спасибо. Это работает.   -  person Morteza    schedule 16.09.2014
comment
Пожалуйста. Кстати, я не знаю, является ли это просто тестовым скриптом, но... обычно вы бы не использовали здесь cfparam. Вместо этого вы должны использовать structKeyExists, чтобы проверить, была ли отправлена ​​форма. Если это так, запустите INSERT. Таким образом, вы не вставляете пустые значения каждый раз при загрузке страницы. т.е. <cfif structKeyExists(FORM, "postTextBox")> do insert</cfif>   -  person Leigh    schedule 17.09.2014
comment
Да, я знаю об этом, это был простой тестовый сценарий.   -  person Morteza    schedule 17.09.2014


Ответы (2)


(Из комментариев...)

Проверьте кодировку вашего столбца или таблицы. Убедитесь, что он поддерживает символы Юникода. Например, UTF-8:

CREATE TABLE ( name varchar(500) CHARSET UTF8, ....)

Кроме того, вместо использования синтаксиса N'literal' вы можете хорошо используйте новый cfsqltype cf_sql_nvarchar. С этими изменениями все должно работать нормально.

    INSERT INTO ad ( name )  
    VALUES 
    (
       <!--- always scope variables ---> 
       <cfqueryparam value="#FORM.postTextBox#" cfsqltype="cf_sql_nvarchar">
    )

Примечание. Не имеет отношения к вашему вопросу, но cfprocessingdirective здесь не действует. Он используется, когда вам нужно внедрить или жестко закодировать символы Unicode в сценарии CF. Поскольку вы этого не делаете, вам это не нужно.

person Leigh    schedule 16.09.2014

Проблема наличия "????" знаки вместо арабских символов могут быть двумя проблемами; При условии, что вы используете MySQL 5 с ColdFusion 10 или 11:

Первая проблема: возможно, вы не настроили базу данных MySQL на UTF-8, чтобы преобразовать всю вашу БД в UTF-8, используйте следующие команды в MySQL:

Используйте команды ALTER DATABASE и ALTER TABLE.

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Вторая проблема: источник данных ColdFusion не настроен должным образом, и ему потребуется добавить еще две дополнительные строки с помощью параметров ColdFusion Data Source.

Перейдите к администратору ColdFusion, откройте страницу Data Source и щелкните источник данных, который вы уже настроили.

Data & Services > Datasources > MySQL 5

Нажмите Data Source Name и нажмите Show Advanced Settings, в поле Connection String добавьте следующие два значения sting.

useUnicode=true&characterEncoding=utf8

Как только вы сохраните детали конфигурации, ColdFusion начнет преобразовывать данные в набор символов UTF-8, и у вас будут правильные арабские или персидские символы.

Примечание. Если вы используете хостинг у некоторых поставщиков услуг хостинга, таких как моя хостинговая компания, вам нужно будет запросить добавление этого в источник данных для вашей БД у групп поддержки хостинга, я Я уверен, что большинство хостинговых компаний без проблем добавят их вам. Также обратите внимание, что у них может быть среда балансировки нагрузки, и в этом случае вы можете иногда получать «????» и иногда правильные «арабские» символы, в этом случае убедитесь, что они добавляют указанную выше строку на все свои серверы CF в среде H/A (т. е. это случилось со мной).

Надеюсь, это поможет решить проблему.

person Fawaz Taj    schedule 12.04.2015