为啥我的查询结果将预期结果从“300”更改为上标“L”?

Posted

技术标签:

【中文标题】为啥我的查询结果将预期结果从“300”更改为上标“L”?【英文标题】:Why is the result of my query changing the expected result from "300" to what appears to be a superscript "L"?为什么我的查询结果将预期结果从“300”更改为上标“L”? 【发布时间】:2019-12-19 18:32:10 【问题描述】:

我目前正在通过 php 和 sqlsrv_connect 协议查询 MS SQL Server 数据库。在我的表中,有一列包含文件位置:

\\FILESERVER123\IDImages\Photos\003741.jpg

然后我使用 PHP 的 str_replace() 将其转换为 URL:

$imglink = str_replace('\\\\FILESERVER123\\IDImages\\Photos','http://webserver/idphotos/',$row['SeeExampleAbove'])

“003”在某些时候被转换为看起来像上标“L”的东西。它似乎发生在初始查询中,而不是在 str_replace() 期间,但我不知道为什么这次我的 Google 技能没有帮助。

跟字符编码有关系吗?

【问题讨论】:

它在哪里显示为上标 L?我只能猜测它是某种 hex/ascii 代码。 通过 SQL Server Management Studio 查看时,存储在数据库中的值显示“003”中间字符串。当我查询数据库时,结果字符串会显示一个上标“L”,其中应该是“003”。我刚刚注意到另一个示例,其中表中的“011”在查询后被转换为一系列空格。如果我直接从 SQL Server Management Studio 复制粘贴到记事本中,URL 会按预期粘贴。 转义反斜杠。在字符串中使用 \ 会产生奇怪的结果。将它们更改为 \\,它转义回 \。或者,将它们替换为 / 之类的东西,直到您需要将它们尊为 \. 那可能是和SQL Server Management Studio有关,把字符串位转换成别的东西。 您没有在照片之后转义 \。因此,您的最终到达网址中会出现 \。 【参考方案1】:

您不会在照片之后转义 \。因此,您的最终到达网址中会出现 \。

这只是为了让您可以将其作为正确答案。但是,既然是答案,我觉得有必要解释一下……

对于大多数编程语言(包括 PHP),\ 字符用作字符串中的转义字符。在 " 和 " 之间(也经常在 ' 和 ' 之间),\ 用于表示后面的字符具有特殊含义。例如,"This \" 打印引号"。\" 表示 \ 后面的 " 不是字符串的结尾。

因为\具有特殊含义,要打印\,您需要使用\对其进行转义。两个 \ 字符被解释为一个 .

许多语言允许您使用 \ 通过代码输入字符。键入 \,然后键入所需字符的数字代码。在这个问题中,\ 后跟一个数字(一个示例中为 003,另一个示例中为 011)。计算机将它们翻译成一个字符(可能是一个 unicode 字符)。

这个问题的根源是 Windows,或者确切地说是 MS-DOS。早在 MS-DOS(和 Windows)之前,分层文件系统使用 / 来分隔目录和文件。由于未知原因,由于 MS-DOS,QDOS 选择使用 .现在,当 Windows 用户引用文件系统中的某个位置时,他或她必须将所有 \ 字符转义为 \。但这不必那么难。我已经在 Windows 7 和 10 中尝试过 PHP。如果我参考“c:/users/myuser/downloads/somefile.jpg”,它工作得很好。 PHP 的文件处理程序知道我正在输入 / 但它需要使用 \ 来表示操作系统。它是为我翻译的(Yay 4th Generation Programming Languages!)。因此,整个问题可以通过从一开始就用 / 字符替换所有 \ 字符来解决。

最终发生的事情是替换在文件的路径名中留下了一个 \。这没有转义为 \ 并被翻译为特殊字符。

【讨论】:

优秀的文章!再次感谢,凯诺。作为附录,这是一个很好的例子,说明了为什么当您无法在代码中找到错误时,有时应该离开某个问题几分钟。【参考方案2】:

您不会在照片之后转义 \。因此,您的最终 URL 中会出现一个 \。 – kainaw 27 分钟前

就这么简单。我花了太多时间来解决这个问题。感谢大家的回复。

【讨论】:

以上是关于为啥我的查询结果将预期结果从“300”更改为上标“L”?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:将输入查询的结果更改为友好URL

SSIS - “外部表不是预期的格式”和.xls文件

为啥 CodeIgniter 不会在括号中返回 SQL 查询的结果?

将 MySQL 命令行结果的输出格式更改为 CSV

如何在sql查询中将列更改为行

如何将查询更改为核心数据(神奇记录)中的获取结果?