Почему Perl DBI экранирует значения, полученные из MySQL?



У меня есть значение в MySQL, которое содержит Апостроф () и многоточие (...):



$ /bin/echo "select alias from url_alias where source = 'node/12024'" | 
mysql --skip-column-names -D cat36ia_d7prod


Вывод:



forum/technical-discussion/nagging-questions-i’ve-been-too-embarrassed-ask…


Когда я получаю значение с помощью Perl DBI и DBD::mysql, значение было изменено:



$ perl -MDBI -MDBD::mysql -e
'$dbh=DBI->connect( "DBI:mysql:database=my_db",nick );
$v=$dbh->selectrow_array(qq|select alias from url_alias where source = "'node/12024'"|);
print "$vn";'


Вывод:



forum/technical-discussion/nagging-questions-i?ve-been-too-embarrassed-ask?


Почему Perl делает это? Могу ли я его отменить?

623   3  

3 ответов:

  1. Скажите Perl, как закодировать выходные данные.

    use open ':std', ':encoding(UTF-8)';
    
  2. Получить данные из базы данных в виде текста с помощью

    DBI->connect("DBI:mysql:database=my_db", $user, $pass, {
       mysql_enable_utf8 => 1,
    })
    

Вероятно, вам нужно сказать DBI, чтобы использовать UTF8 при разговоре с базой данных.

$dbh=DBI->connect(
   'DBI:mysql:database=my_db', $user, $pass,
   { mysql_enable_utf8 => 1 }
);

Вопрос: Почему Perl делает это? Могу ли я его отменить?

Этого не избежать. Это симптом проблемы с переводом набора символов. Знак вопроса-это символ по умолчанию, используемый, когда кодовая точка не сопоставляется ни с каким другим символом в целевом наборе символов.


Краткий ответ, почему Perl делает это, может быть: по умолчанию Perl выводит STDOUT с помощью набора символов ascii. Поскольку ASCII поддерживает только кодовые точки до U+00EF, все остальные кодовые точки (например, символы со 128 по 255) переводятся в знак вопроса.

Краткий ответ о том, как переопределить это поведение, может быть следующим: укажите, что STDIN, STDOUT и STDERR используют кодировку utf8, а не ascii, включив строку, подобную этой, в вашу программу perl:

use open qw(:std :utf8);

Другой потенциальной проблемой является установка переменной MySQL session character_set_client; соединение с базой данных может использовать набор символов latin1, но набор символов базы данных / сервера / столбца может быть utf8, так что перевод набора символов может также происходить там.

И можно указать набор символов, который будет использоваться в соединении с базой данных, чтобы избежать нежелательной трансляции набора символов.


В качестве отправной точки для понимания наборов символов, вот две ссылки, которые вы должны иметь под своим поясом:

Абсолютный минимум каждый разработчик программного обеспечения абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!)

Что Абсолютно, Положительно Должен Знать Каждый Программист О Кодировках И Наборах Символов Для Работы С Текстом

Comments

    Ничего не найдено.