通过chromebook终端访问的远程机器上的MySQL返回无意义的unicode,它在我离开MySQL后仍然存在

时间:2014-05-04 18:48:38

标签: mysql unicode chromebook

我正在使用chromebook中的终端ssh到远程服务器。当我运行MySQL(5.6)选择查询时,有时其中一个字段将返回无意义的unicode(当字段应返回电子邮件地址时)并从以下位置更改MySQL提示符:

的MySQL>

└≤⎽─┌>

并且我键入的任何文本都会转换为奇怪的unicode。即使我退出MySQL

后问题仍然存在

1 个答案:

答案 0 :(得分:2)

数据库中的一个值碰巧有字节序列0x1B,0x28,0x30(ESC ) 0)。当您执行查询时,MySQL将此字节序列直接打印到您的控制台。您可以通过从python:

键入来重现效果
>>> print '\x1B\x28\x30'

控制台使用控制字符(特别是0x1B,ESC)作为一种方法,允许应用程序控制除纯文本之外的控制台方面,例如颜色和光标移动。这种行为继承自他们假装的旧哑终端设备(这就是为什么它们也被称为终端仿真器),以及我们可能不再需要的一些奇怪的技巧。其中之一是在不同的字符集之间永久切换(现在考虑编码,但这早在Unicode之前)。

其中一个替代字符集是DEC Special Graphics Character Set,它看起来就像你在这里一样。在此字符集中,字节0x6D(通常在ASCII中用于m)以图形字符形式出现。

原则上你可以通过打印一个字节序列0x1B,0x28,0x42(ESC ) B)将你的终端重置为普通的ASCII,但这往往是一个痛苦的安排当你的控制台显示垃圾时。

您的控制台可能会有其他方式混淆;通常,安全地将任意二进制数据打印到控制台是不安全的。通过伪造键盘输入,你甚至可以使用控制台做更糟糕的事情,这使得这成为一个安全问题,但今天它只是一个令人烦恼的因素。

但是,人们通常不希望在电子邮件地址字段中包含任何控制代码。我建议使用数据库的应用程序应该对它接收的输入进行一些验证,并删除或阻止所有控制代码(必要时除可能的换行之外)。

作为ESC字符的特定情况清除此字段的快速黑客,您可以执行以下操作:

UPDATE things SET email=REPLACE(email, CHAR(0x1B), '');