(注意:这个问题不是关于转义查询,而是关于转义结果)
我正在使用 GROUP_CONCAT将多行组合成一个逗号分隔的列表。例如,假设我有两个(示例)表:
CREATE TABLE IF NOT EXISTS `Comment` (
`id` int(11) unsigned NOT NULL auto_increment,
`post_id` int(11) unsigned NOT NULL,
`name` varchar(255) collate utf8_unicode_ci NOT NULL,
`comment` varchar(255) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `post_id` (`post_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
INSERT INTO `Comment` (`id`, `post_id`, `name`, `comment`) VALUES
(1, 1, 'bill', 'some comment'),
(2, 1, 'john', 'another comment'),
(3, 2, 'bill', 'blah'),
(4, 3, 'john', 'asdf'),
(5, 4, 'x', 'asdf');
CREATE TABLE IF NOT EXISTS `Post` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;
INSERT INTO `Post` (`id`, `title`) VALUES
(1, 'first post'),
(2, 'second post'),
(3, 'third post'),
(4, 'fourth post'),
(5, 'fifth post'),
(6, 'sixth post');
我想列出所有帖子以及对帖子发表评论的每个用户名的列表:
SELECT
Post.id as post_id, Post.title as title, GROUP_CONCAT(name)
FROM Post
LEFT JOIN Comment on Comment.post_id = Post.id
GROUP BY Post.id
给我:
id title GROUP_CONCAT( name )
1 first post bill,john
2 second post bill
3 third post john
4 fourth post x
5 fifth post NULL
6 sixth post NULL
这很好用,但如果用户名包含逗号,则会破坏用户列表。 MySQL 是否有一个函数可以让我转义这些字符? (请假设用户名可以包含任何字符,因为这只是一个示例架构)
最佳答案
实际上,有ascii控制字符专门用于分隔数据库字段和记录:
0x1F (31): unit (fields) separator
0x1E (30): record separator
0x1D (29): group separator
您永远不会在用户名中使用它们,并且很可能永远不会在数据库中的任何其他非二进制数据中使用它们,因此可以安全地使用它们:
GROUP_CONCAT(foo SEPARATOR 0x1D)
然后用 CHAR(0x1D) 以您想要的任何客户端语言进行拆分。
关于MySQL GROUP_CONCAT 转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/452357/
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我遇到了一个非常困难的时期:#containedwithin:"MA\u008EEIKIAI"#shouldbe"MAŽEIKIAI"#natureofstring$pstring3"MA\u008EEIKIAI"$putsstring3MAEIKIAI$string3.inspect"\"MA\\u008EEIKIAI\""$string3.bytes#关于从哪里开始的任何想法?注意:这不是我的previousquestion的副本. 最佳答案 \u008E表示代码点为8e(十六进制)的unicode字符出现在字符串中的那个位置。
给定这段代码:has_many:foos,:finder_sql=#{id}部分被过早插入。我如何逃脱它? 最佳答案 在定界符两边加上单引号:has_many:foos,:finder_sql= 关于ruby-如何转义Ruby字符串插值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2052724/
知道如何在Ruby中对以下字符串进行转义吗?C:\inetpub\wwwroot\adminWeb到C:\inetpub\wwwroot\adminWeb或到C%3A%5Cinetpub%5Cwwwroot%5CadminWeb尝试使用URI.decode没有成功。 最佳答案 CGIlibrary是一种选择:require'cgi'CGI.unescapeHTML('C:\inetpub\wwwroot\adminWeb')#=>"C:\\inetpub
我在我的应用程序中使用to_param创建自定义URL(此自定义路径包含斜杠):classMachine问题是,自从Rails4.1.2行为发生变化并且Rails不允许在URL中使用斜线(当使用自定义URL时),所以它转义了斜线。我有这样的路线:Rails.application.routes.drawdoscope"(:locale)",locale:/#{I18n.available_locales.join("|")}/doresources:machines,except::destroydocollectiondoget:searchget'search/:ad_type(/
我这辈子都弄不明白,尽管它应该很简单。如何用"\("和替换字符串中所有出现的"("和")""\)"?似乎没有任何效果:"foo(bar)foo".gsub("(","\(")#=>"foo(bar)foo""foo(bar)foo".gsub("(","\\(")#=>"foo\\(bar)foo"有什么想法吗? 最佳答案 第二次尝试时您已经有了解决方案,您只是感到困惑,因为字符串在交互式解释器中以转义形式显示。但实际上只有一个反斜杠,没有两个。尝试使用puts打印它,您会发现实际上只有一个反斜杠:>"foo(bar)foo".gs
除了使用\x08删除前导字符外,是否可以同时删除尾随字符?是否有一个转义序列将删除下一个字符而不是前一个字符?我看到delete显然映射到ASCII127,即Hex7F,但以下代码:puts"a\x08b\x7fcd"产生b⌂cd我预计\x7f会删除它后面的'c'字符,但它没有。 最佳答案 您实际上并没有使用\x08删除任何内容,您只是用“b”覆盖了“a”。想象一下您使用电传纸质终端的过去。您实际上会在纸上看到的是打印的“a”,电传打字机会备份一个空格,然后在其上打印“b”。所有非打印的ascii码都是为了控制电传纸终端的移动而发明
我最近将我的Ruby1.9.3升级到2.0.0并感到惊讶;CGI::escapeHTML现在转义单引号,意思是:CGI::escapeHTML("'")=>"'"最奇怪的是,当定义escapeHTML时,一切似乎都很好,复制方法的定义给出了正确的结果(它不转义单引号)有人知道这件事吗?谢谢, 最佳答案 实际上,它执行2.0源代码中定义的操作。但你是对的,实现从1.9.3更改为2.0。1.9.3source:defCGI::escapeHTML(string)string.gsub(/[&\"]/,TABLE_FOR_ESCA
我必须阅读一些包含以下内容的文本文件:\u201CGushingCross的小贩夫人\u201D在ruby1.9终端中,当我创建一个包含以下内容的字符串时:ruby-1.9.1-p378>"\u2714\u2714mygreatstring\u2714\u2714"=>"✔✔mygreatstring✔✔"在ruby1.8中,我没有将unicode代码转换为它们的字符:ree-1.8.7-2010.01>"\u2714\u2714mygreatstring\u2714\u2714"=>"u2714u2714mygreatstringu2714u2714"有什么简单的方法可以在R