我正在使用 chromebook 中的终端通过 ssh 连接到远程服务器。当我运行 MySQL (5.6) 选择查询时,有时其中一个字段会返回无意义的 unicode(当该字段应返回电子邮件地址时)并将 MySQL 提示更改为:
数据库>
到
└≤⎽─┌>
我输入的任何文本都会被转换成奇怪的 unicode。即使我退出 MySQL,问题仍然存在
最佳答案
数据库中的一个值恰好包含字节序列 0x1B、0x28、0x30 (ESC
)
0
) .当您进行查询时,MySQL 将此字节序列直接打印到您的控制台。您可以通过从 python 中键入来重现效果:
>>> print '\x1B\x28\x30'
控制台使用控制字符(特别是 0x1B、ESC
)作为允许应用程序控制控制台其他方面而不是纯文本的方式,例如颜色和光标移动。这种行为继承自他们伪装成的旧的哑终端设备(这就是为什么它们也被称为终端仿真器),以及一些我们可能不再需要的更奇怪的技巧。其中之一是在不同字符集之间永久切换(现在考虑编码,但这早于 Unicode)。
这些替代字符集之一是 DEC Special Graphics Character Set它看起来像你在这里。在此字符集中,通常在 ASCII 中用于 m
的字节 0x6D 作为图形字符 └
出现。
原则上,您可以通过打印字节序列 0x1B、0x28、0x42 (ESC
)
B
) 将您的终端重置为正常的 ASCII,但是当您的控制台显示垃圾时,这往往很难安排。
还有其他可能让您的控制台变得困惑的方式;将任意二进制数据打印到控制台通常不是安全的。过去,您甚至可以通过伪造键盘输入来使用控制台做一些更糟糕的事情,这使它成为一个安全问题,但今天它只是一个烦人的因素。
但是,人们通常不会期望在电子邮件地址字段中有任何控制代码。我建议使用数据库的应用程序应该对其接收到的输入进行一些验证,并删除或阻止所有控制代码(必要时可能换行除外)。
作为针对 ESC
字符的特定情况清理此字段的快速破解,您可以执行以下操作:
UPDATE things SET email=REPLACE(email, CHAR(0x1B), '');
关于通过 chromebook 终端访问的远程机器上的 MySQL 返回无意义的 unicode,它在我离开 MySQL 后仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23460182/