php 使用 concat_ws 在 mysql 结果中添加空格

Posted

技术标签:

【中文标题】php 使用 concat_ws 在 mysql 结果中添加空格【英文标题】:php adding blank spaces to mysql result with concat_ws 【发布时间】:2021-03-14 21:05:52 【问题描述】:

我有以下日期设置和查询:


create table test (
  id int unsigned not null auto_increment primary key,
  street1 varchar(32) not null default '',
  street2 varchar(32) not null default '',
  city varchar(32) not null default '',
  state varchar(32) not null default '',
  code varchar(32) not null default '',
  country varchar(32) not null default ''
);

insert into test (street1, street2, city, state, code, country) 
          values ('44 Abc St', '', 'NYC', 'New York', '10016', 'United States');


    select 
     concat_ws('\n', NULLIF(street1, ''), NULLIF(street2, ''),
                     NULLIF(city, ''), NULLIF(state, ''),
                     NULLIF(code, ''), NULLIF(country, '')) o_address
    from test

http://sqlfiddle.com/#!9/b919c4/3/0

但不知何故,php 用额外的空格来解释这个字符串,如下所示: 我确信它是在获取期间,因为在少数 mysql IDE 上进行了测试,并且查询工作正常。

44 Abc St
        NYC
        New York
        10016
        United States

【问题讨论】:

你如何显示这个地址? 你能提供一个完整的代码sn-p重现你的情况吗? 这只是一个常规的 PDO 提取,然后只是回显到页面。 我所做的任何事情都无法重现。你需要给我们完整的背景。 “只是呼应”当然不会产生新的台词。 我不使用任何 str 替换或其他什么,它只是与新行有关,因为如果我只使用 \r (回车)那么它工作正常 【参考方案1】:

这一切都取决于您使用什么来渲染您从 CONCAT_WS() 返回的“纯文本”字符串。从你的问题中不可能知道那是什么。

你说它不是网络浏览器中的<pre> 标签。

它可能不是 UNIX 风格的终端仿真器,因为它们将 \n 视为移动到新行的第一个位置的指令。

也许是 Win cmd.exe 或 powershell。

你最好的选择可能是使用

WS_CONCAT( '\r\n', whatever)

这两个字符序列在各种情况下都能满足您的需求。

【讨论】:

嗨,我说它是内容类型的纯文本/文本,因此浏览器会显示所有新行选项卡和空格。我还说,如果我使用 \r 它可以正常工作,即使使用 \n 它对于使用一些 MySQL IDE 检查的结果都是一样的,比如我使用 DataGrip。我还说我使用 PDO 扩展,但不确定是否有任何与设置相关的内容。这种情况以前没有发生,但几天前就开始了。【参考方案2】:

这里肯定是你的代码有问题;我无法复制您使用...描述的行为。

$dbh=mysqli_connect('localhost', 'root');
$res=mysqli_query($dbh, $sql);
$data=mysqli_fetch_assoc($res);
var_export($data);

这给了我:

symcbean@hal9000 $ php -q test2.php
array (
  'o_address' => '44 Abc St
NYC
New York
10016
United States',

为了确保我在屏幕上看到的内容毫无疑问(您也应该这样做),我检查了屏幕上写入的内容:

symcbean@hal9000 $ php -q test2.php | xxd
00000000: 6172 7261 7920 280a 2020 276f 5f61 6464  array (.  'o_add
00000010: 7265 7373 2720 3d3e 2027 3434 2041 6263  ress' => '44 Abc
00000020: 2053 740a 4e59 430a 4e65 7720 596f 726b   St.NYC.New York
00000030: 0a31 3030 3136 0a55 6e69 7465 6420 5374  .10016.United St
00000040: 6174 6573 272c 0a29                      ates',.)

【讨论】:

感谢您的第一时间,同样的事情向我展示了结果,新行后跟 8 个空格字符,我们代码的唯一区别是我使用 PDO 模块。将创建一个单独的测试用例并发布代码,以便您确保它是相同的

以上是关于php 使用 concat_ws 在 mysql 结果中添加空格的主要内容,如果未能解决你的问题,请参考以下文章

mysql concat_ws 与 concat 多字段模糊匹配应用

如何在 MySQL 中对 concat_ws(',',collect_list(a)) 进行排序?

mysql:concat()与concat_ws()

mysql之concat concat_ws group_concat

运算符的差异

MYSQL GROUP_CONCAT CONCAT_WS 并处理 NULL 值