【问题标题】:Compare and trim binary/unicoded string to normal string?将二进制/编码字符串与普通字符串进行比较和修剪?
【发布时间】:2021-06-10 20:18:33
【问题描述】:

我正在使用下面的 mysql 查询来检查哪些记录与修剪后的值不同

SELECT id, BINARY(username) as binary_username, TRIM(username) as trim_username FROM table.

上面的查询返回二进制值和修剪后的值,如下所示。

mysql查询结果:

上图中突出显示的值表示二进制值与修剪后的值不同。

我尝试了以下两件事:

  • 计算二进制和修剪列的长度,但它是相同的LENGTH(binary_username) != LENGTH(trim_username)

  • 直接将它们等同于binary_username != trim_username

但它们都返回空记录。

如何使用 mysql 获取这些突出显示的条目?

编辑 1:我在查询结果中添加了 HEX 值

SELECT id, BINARY(username) as binary_username, TRIM(username) as trim_username, HEX(username) as hex_username FROM table

提前谢谢...

【问题讨论】:

  • 显示 hex(username) 可能会有所帮助。
  • 不,那没用
  • “它没有用”是什么意思? hex(trim(username)) 对于 196447 的输出是 546F617374 那么?
  • 试试where username != trim(username)。我怀疑你的用户名末尾有奇怪的空格
  • 只需获取 HEX(用户名);我怀疑它是双重编码的!

标签: php mysql regex binary trim


【解决方案1】:

为避免存储、修剪等尾随零,请使用VARBINARY 而不是BINARY。为什么,请告诉我,您使用 BINARY 作为文本字符串??

SELECT HEX(username) FROM ...,以便我们进一步诊断问题。那个截图很可疑——我们不知道客户端做了什么来“修复”输出。

嗯,这些都不是用 UTF-8 编码的,也不是我认识的任何其他东西。 “坏”字符(02、04、0c 17)在几乎所有编码中都是“控制代码”。 (“Unicode”不是一种编码方式,所以不相关。)

您想要测试控制代码的 REGEXP 吗?

在 PHP 中,json_encode 有一个JSON_UNESCAPED_UNICODE 的选项。见https://www.php.net/manual/en/function.json-encode.php

但这会生成\u1234 类型的文本。

将二进制数据存入 MySQL 时,使用 PDO 或 mysqli 中的绑定或转义机制。

【讨论】:

  • 我没有将BINARY 用于文本字符串,我只使用VARCHAR。有人传入我需要识别和删除的未编码字符串。我还需要限制任何其他用户传递这些未编码的字符串。
  • @AnkitJindal - 我添加到我的答案中。
  • 我收到了20\u00042I\u0000\u0000\u0000\u0000\u0000\ufffd\u001ex\ufffd\ufffd\ufffd\ufffd~\ufffd\ufffdM4\ufffdM4\ufffd 等我需要限制的输入。处理所有此类情况的好方法是什么?
  • 来自 JSON?查看选项。
  • 您在评论中指的是哪些选项?
猜你喜欢
  • 1970-01-01
  • 2011-11-22
  • 2017-01-26
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多