Site updated: 2023-05-25 18:38:45
This commit is contained in:
1 parent
3e7faed94c
commit
9f8985fdef
163 files changed
+305
-330
No files matched your search
@@ -6,6 +6,30 @@
|
||||
"description": "天生我材必有用",
|
||||
"home_page_url": "https://hitoli.com",
|
||||
"items": [
|
||||
{
|
||||
"id": "https://hitoli.com/2023/05/25/%E8%A7%A3%E5%86%B3MySQL%E6%8A%A5only-full-group-by%E9%94%99%E8%AF%AF/",
|
||||
"url": "https://hitoli.com/2023/05/25/%E8%A7%A3%E5%86%B3MySQL%E6%8A%A5only-full-group-by%E9%94%99%E8%AF%AF/",
|
||||
"title": "解决MySQL报only_full_group_by错误",
|
||||
"date_published": "2023-05-25T10:25:00.000Z",
|
||||
"content_html": "<h4 id=\"问题描述\"><a class=\"anchor\" href=\"#问题描述\">#</a> 问题描述</h4>\n<p>当我们迁移到 MySQL 5.7+ 的版本时,常会碰到 ERROR 1055 only_full_group_by 错误,这是 5.7 之后 SQL_MODE 默认打开了严格模式导致的错误。说明你代码里有地方写的不严谨。</p>\n<h4 id=\"解决方法\"><a class=\"anchor\" href=\"#解决方法\">#</a> 解决方法</h4>\n<ol>\n<li>重写 sql</li>\n<li>返回宽松模式</li>\n</ol>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#查询 sql_mode</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">select</span> @<span class=\"token variable\">@GLOBAL.sql_mode</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\">#删除 ONLY_FULL_GROUP_BY</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token comment\">#设置 sql_mode</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">set</span> @<span class=\"token variable\">@GLOBAL.sql_mode</span><span class=\"token operator\">=</span><span class=\"token string\">'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><ol start=\"3\">\n<li>使用聚合函数<br />\n如果某些特别的原因就是要查询未分组字段,但你又没空改代码,那么我们可使用聚合函数来规避这类错误,算是一种折中的方案了,语法改严谨了,代码又不需要大动。如 ANY_VALUE ()、MAX ()、MIN () 或者 GROUP_CONCAT () 等聚合函数。</li>\n</ol>\n",
|
||||
"tags": [
|
||||
"工作",
|
||||
"解决问题",
|
||||
"mysql"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "https://hitoli.com/2023/05/25/MySQL%E4%B8%AD%E7%9A%84any-value-%E5%87%BD%E6%95%B0/",
|
||||
"url": "https://hitoli.com/2023/05/25/MySQL%E4%B8%AD%E7%9A%84any-value-%E5%87%BD%E6%95%B0/",
|
||||
"title": "MySQL中的any_value()函数",
|
||||
"date_published": "2023-05-25T10:07:00.000Z",
|
||||
"content_html": "<h4 id=\"问题\"><a class=\"anchor\" href=\"#问题\">#</a> 问题</h4>\n<p>业务要求:查询所有省份:<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/05/25/778f34f5670d.png\" alt=\"\" /></p>\n<h4 id=\"方法\"><a class=\"anchor\" href=\"#方法\">#</a> 方法</h4>\n<ol>\n<li>distinct 排除重复</li>\n</ol>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">SELECT</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>\t<span class=\"token keyword\">DISTINCT</span><span class=\"token punctuation\">(</span>province_code<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>\tprovince_name</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">FROM</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>\tt_mip_base_area</pre></td></tr></table></figure><ol start=\"2\">\n<li>group by 根据身份编码分组</li>\n</ol>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">SELECT</span> </pre></td></tr><tr><td data-num=\"2\"></td><td><pre>\tprovince_code<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>\tany_value<span class=\"token punctuation\">(</span>province_name<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">FROM</span> t_mip_base_area</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">GROUP</span> <span class=\"token keyword\">BY</span> province_code</pre></td></tr></table></figure><h6 id=\"若这样写\"><a class=\"anchor\" href=\"#若这样写\">#</a> 若这样写</h6>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">SELECT</span> </pre></td></tr><tr><td data-num=\"2\"></td><td><pre> province_code<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> province_name</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">FROM</span> t_mip_base_area</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">GROUP</span> <span class=\"token keyword\">BY</span> province_code</pre></td></tr></table></figure><p>则会报错<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/05/25/c57a8e811928.png\" alt=\"\" /></p>\n<h4 id=\"总结\"><a class=\"anchor\" href=\"#总结\">#</a> 总结:</h4>\n<ol>\n<li>\n<p>MySQL5.7 之后,sql_mode 中 ONLY_FULL_GROUP_BY 模式默认设置为打开状态。</p>\n</li>\n<li>\n<p>ONLY_FULL_GROUP_BY 的语义就是确定 select target list 中的所有列的值都是明确语义,简单的说来,在此模式下,target list 中的值要么是来自于聚合函数(sum、avg、max 等)的结果,要么是来自于 group by list 中的表达式的值</p>\n</li>\n<li>\n<p>MySQL 提供了 any_value () 函数来抑制 ONLY_FULL_GROUP_BY 值被拒绝</p>\n</li>\n<li>\n<p>any_value () 会选择被分到同一组的数据里第一条数据的指定列值作为返回数据</p>\n</li>\n</ol>\n",
|
||||
"tags": [
|
||||
"工作",
|
||||
"解决问题",
|
||||
"mysql"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "https://hitoli.com/2023/04/16/%E5%91%BD%E4%BB%A4%E5%A4%A7%E6%9D%82%E7%83%A9/",
|
||||
"url": "https://hitoli.com/2023/04/16/%E5%91%BD%E4%BB%A4%E5%A4%A7%E6%9D%82%E7%83%A9/",
|
||||
@@ -246,31 +270,6 @@
|
||||
"NodeJS",
|
||||
"yarn"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "https://hitoli.com/2022/11/03/%E4%B8%8A%E7%8F%AD%E4%BA%86/",
|
||||
"url": "https://hitoli.com/2022/11/03/%E4%B8%8A%E7%8F%AD%E4%BA%86/",
|
||||
"title": "上班了",
|
||||
"date_published": "2022-11-03T03:25:00.000Z",
|
||||
"content_html": "<ul>\n<li>终于又上班了。O (∩_∩) O~</li>\n</ul>\n",
|
||||
"tags": [
|
||||
"生活",
|
||||
"心情",
|
||||
"心情"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "https://hitoli.com/2022/11/02/2-dev-null%E5%92%8C-dev-null-2-1%E5%92%8C2-1-dev-null%E7%9A%84%E5%8C%BA%E5%88%AB/",
|
||||
"url": "https://hitoli.com/2022/11/02/2-dev-null%E5%92%8C-dev-null-2-1%E5%92%8C2-1-dev-null%E7%9A%84%E5%8C%BA%E5%88%AB/",
|
||||
"title": "2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的区别",
|
||||
"date_published": "2022-11-02T08:29:00.000Z",
|
||||
"content_html": "<h4 id=\"区别\"><a class=\"anchor\" href=\"#区别\">#</a> 区别:</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token operator\"><span class=\"token file-descriptor important\">2</span>></span>/dev/null</pre></td></tr></table></figure><p>意思就是把错误输出到 “黑洞”</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token operator\">></span>/dev/null <span class=\"token operator\"><span class=\"token file-descriptor important\">2</span>></span><span class=\"token file-descriptor important\">&1</span></pre></td></tr></table></figure><p>默认情况是 1,也就是等同于 1>/dev/null 2>&1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞”</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token operator\"><span class=\"token file-descriptor important\">2</span>></span><span class=\"token file-descriptor important\">&1</span> <span class=\"token operator\">></span>/dev/null</pre></td></tr></table></figure><p>意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕</p>\n<h4 id=\"解释\"><a class=\"anchor\" href=\"#解释\">#</a> 解释:</h4>\n<ol>\n<li>\n<p>文件描述符<br />\n Linux 系统预留三个文件描述符:0、1 和 2,他们的意义如下所示:<br />\n0—— 标准输入(stdin)<br />\n略...<br />\n1—— 标准输出(stdout)<br />\n在当前目录下,有且只有一个文件名称为 a.txt 的文件,这时我们运行这个命令【ls a.txt】, 就会获得一个标准输出 stdout 的输出结果:a.txt<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2022/11/01/newscreen629761046.jpg\" alt=\"\" /><br />\n2—— 标准错误(stderr)<br />\n在当前目录下,有且只有一个文件名称为 a.txt 的文件,我们运行命令【ls b.txt】,我们就会获得一个标准错误 stderr 的输出结果 “ls:无法访问 b.txt:没有这样的文件或目录”。<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2022/11/01/newscreen629793578.jpg\" alt=\"\" /></p>\n</li>\n<li>\n<p>重定向<br />\n重定向的符号有两个:> 或 >>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。举例如下:</p>\n</li>\n</ol>\n<ul>\n<li>\n<p>重定向标准输出 stdout<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2022/11/01/newscreen630033531.jpg\" alt=\"\" /><br />\n 如上图所示,对比没有添加重定向的操作,这条命令在使用之后并没有将 a.txt 打印到屏幕。在紧接的 cat 操作后,可以发现本来应该被输出的内容被记录到 stdout.txt 中。</p>\n</li>\n<li>\n<p>重定向标准错误 stderr<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2022/11/01/newscreen630256640.jpg\" alt=\"\" /><br />\n 如上图所示,文件描述符 2,标准错误的重定向也是同样的原理被记录在了文件 stderr.txt 这个文件里面了。</p>\n</li>\n<li>\n<p>可以将 stderr 单独定向到一个文件,stdout 重定向到另一个文件</p>\n</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">ls</span> b.txt <span class=\"token operator\"><span class=\"token file-descriptor important\">2</span>></span> stderr.txt <span class=\"token operator\"><span class=\"token file-descriptor important\">1</span>></span>stdout.txt</pre></td></tr></table></figure><ul>\n<li>也可以将 stderr 和 stdout 重定向到同一个文件</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">ls</span> b.txt <span class=\"token operator\">></span> output.txt <span class=\"token operator\"><span class=\"token file-descriptor important\">2</span>></span><span class=\"token file-descriptor important\">&1</span></pre></td></tr></table></figure><ul>\n<li>或采用下面的方法,可以少写几个字,能达到同样的效果</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">ls</span> b.txt <span class=\"token operator\">&></span> output.txt</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">ls</span> b.txt <span class=\"token operator\">>&</span> output.txt <span class=\"Line truncated
|
||||
"tags": [
|
||||
"Linux",
|
||||
"Shell",
|
||||
"Shell",
|
||||
"2>&1"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user