Почему 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 делает это? Могу ли я его отменить?
3 ответов:
Скажите Perl, как закодировать выходные данные.
use open ':std', ':encoding(UTF-8)';Получить данные из базы данных в виде текста с помощью
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