MySQL на удаленном компьютере, доступ к которому осуществляется через терминал Chromebook, возвращает бессмысленный Unicode, который сохраняется после того, как я покину MySQL
Я использую терминал в Chromebook для SSH на удаленном сервере. Когда я запускаю запрос выбора MySQL (5.6), иногда одно из полей возвращает бессмысленный юникод (когда поле должно возвращать адрес электронной почты) и изменяет приглашение MySQL с:
MySQL>
в
└≤⎽─┌>
и любой текст, который я набираю, конвертируется в странный юникод. Проблема сохраняется даже после выхода из MySQL
1 ответ
У одного из значений в вашей базе данных была последовательность байтов 0x1B, 0x28, 0x30 (ESC
)
0
) в этом. Когда вы сделали запрос, MySQL распечатал эту последовательность байтов прямо на вашей консоли. Вы можете воспроизвести эффект, набрав из python:
>>> print '\x1B\x28\x30'
Консоли используют управляющие символы (в частности, 0x1B, ESC
) как способ позволить приложениям управлять другими аспектами консоли, кроме чистого текста, такими как цвета и движения курсора. Это поведение унаследовано от старых немых терминальных устройств, которыми они притворяются (именно поэтому они также известны как эмуляторы терминалов), наряду с некоторыми более странными приемами, которые нам, вероятно, больше не нужны. Одним из них является постоянное переключение между различными наборами символов (сейчас рассматривается кодировки, но это давно предшествует Unicode).
Одним из таких альтернативных наборов символов является набор специальных графических символов DEC, который выглядит так, как здесь. В этом символе установлен байт 0x6D, обычно используемый в ASCII для m
в качестве графического символа └
,
В принципе, вы можете сбросить свой терминал в обычный ASCII, напечатав последовательность байтов 0x1B, 0x28, 0x42 (ESC
)
B
), но это может быть трудной задачей, когда ваша консоль отображает мусор.
Есть потенциально другие способы, которыми ваша консоль может запутаться; в общем случае безопасно выводить произвольные двоичные данные на консоль. Раньше были даже более неприятные вещи, которые вы могли бы сделать с консолью, имитируя ввод с клавиатуры, что делало это проблемой безопасности, но сегодня это просто фактор раздражения.
Однако, как правило, никто не ожидал бы иметь какие-либо контрольные коды в поле адреса электронной почты. Я предлагаю, чтобы приложение, использующее базу данных, выполняло некоторую проверку входных данных, которые оно получало, и удаляло или блокировало все управляющие коды (кроме потенциально новых строк, где это необходимо).
В качестве быстрого взлома, чтобы очистить это поле для конкретного случая ESC
персонаж, вы могли бы сделать что-то вроде:
UPDATE things SET email=REPLACE(email, CHAR(0x1B), '');