ClickHouse数据库之特殊需求
1.中文ANSI编码
clickhouse官方文档中,提到了如果要存储文本,建议使用UTF-8编码:(参考文章7)
若需存储文本,我们建议使用 UTF-8 编码。至少,如果你的终端使用UTF-8(推荐),这样读写就不需要进行任何的转换了。
还有一句话就是(参考文章7):“ClickHouse 没有编码的概念。字符串可以是任意的字节集,按它们原本的方式进行存储和输出。” 也就是说,你存到数据中的字符编码是什么,那么取出来的就是什么,clickhouse不会进行转换。如果你想存UTF-8字符,那就用UTF-8的字符进行存储,如果你想存gb2312的字符集,那就直接从数据库中查出来相应的字符然后用相应的字符编码存进去就好了。
如果一定要将UTF-8编码转为其他的字符串编码,比如转为ANSI编码,这里有个函数:convertCharset(s, from, to),例如:将utf-8转为GB2312编码
1 | select convertCharset(SiteName, 'UTF-8', 'GB2312') as s from gdnx.siteinfo |
虽然可以转为GB2312编码,但是没有ANSI编码
1.Clickhouse 基础知识 - 函数 (这里也有几个示例说明convertCharset函数的用法,文章中还提到了其他的一些函数,比如算术函数、比较、逻辑、类型转换、日期时间等内容)
2.Ansi,UTF8,Unicode编码(续)
3.字符编码Unicode、UTF-8和ANSI
4.utf-8文件转为ansi文件 python实现
5.Formats for Input and Output Data
6.Ansi Sql兼容性的ClickHouse SQL方言
7.字符串
8.Functions for Working with Strings
9.convertCharset(s, from, to) (这篇官方文档比较有用)
10.The convertCharset (s, ‘utf-8’, ‘utf-16’) doesn’t seem to work properly (这是一个例子)
11.编码函数
2.UPDATE和DELETE
官方介绍上,OLAP的典型的应用场景,有一条就是:不修改已添加的数据。但是如果你非得想让clickhouse实现更新和删除操作怎么办,也不是不可能,最新的更新中,增加了对数据的UPDATE/DELETE操作。
根据参考文章3,clickhouse的SQL语句和标准的ANSI SQL的兼容性文档中可以看出,clickhouse不支持定位更新和删除,但是支持批量的更新或者删除,这是一个新的功能,所以我在官方文档中ALTER的SQL参考中(参考文章7),相对于DROP COLUMN、CLEAR COLUMN等操作,并没有作为一项重要的功能单独的列出来如何进行更新和删除。
1 | /*批量删除*/ |
这个功能是新出的,但是有别于传统的SQL更新和删除操作,在下列情况下无法正常工作:
(1) Updating the index column
更新索引列。索引列不能被更新。
(2) Distributed table updates
对分布式表的更新不起作用。如果一个表是分布式的,那么更新语句也会不起作用,更多的就是使用手动在多个分布式环境中进行更新操作。
(3) Frequent and point(single row) updates
频繁的更新或者是单行更新。不能期望clickhouse像传统的数据库mysql一样,进行单行或者频繁的更新,这个本来就不是数据仓库擅长干的事。
1.Updates and Deletes in ClickHouse (对更新和删除操作的解释和说明)
2.OLAP场景的关键特征
3.ANSI SQL Compatibility of ClickHouse SQL Dialect
4.是否可以从clickhouse表中删除旧记录?
5.SQL ALTER TABLE 语句
6.数据库update和alter之间的区别
7.ALTER
8.Mutations (官方的更新和删除的解释)
3.数据迁移
数据库中数据迁移,因为服务器升级等原因,想要将位于虚拟机A中Clickhouse迁移到位于Docker中的Clickhouse中。
使用remote函数进行数据迁移
1 | ## 导出建表sql |
1.在ClickHouse之间进行数据迁移 (元数据的迁移、通过remote函数进行数据迁移、通过文件导出导入方式进行数据迁移)
2.Clickhouses数据迁移工具:Clickhouse-copier介绍 (主要介绍了使用Clickhouse自带的Clickhouse-copier工具进行复制的操作,但是我使用的是单机版的Clickhouse,没有安装zookeeper,所以我嫌麻烦。数据迁移的三种方法:(1) DETACH/FREEZE分区,进行SCP拷贝,然后再ATTACH;(2) 利用remote函数; (3) clickhouse-copier工具;)
问题
(1) Exception: Syntax error: failed at position 98 (‘'): 'Asia/Shanghai'), endTime
DateTime('Asia/Shanghai'), reportGenerateTime
DateTime('Asia/Shanghai'), results
Nullable(VARCHAR)) ENGINE = MergeTree() O. Unrecognized token: ‘'
这个主要是因为其中的 DateTime('Asia/Shanghai') 中的斜杠,把全部的斜杠去掉就可以了,变成 DateTime(‘Asia/Shanghai’)