dbsystem角色大全(dbsystem哪个角色好)

时间:2023-10-10 17:57:47 来源:互联网 编辑:旧人陌兮

MongoDB用户和角色解释系列(上)

1、介绍

本文讨论保护MongoDB数据库所需的访问控制。具体来说,我们可以使用这些特性来确保只有经过授权的用户才能访问数据库。每个MongoDB用户应该只能访问他们在组织中所扮演的角色所需要的数据,这由组织中负责管理数据安全的人员来决定。这是管理数据和遵守国际要求所必需的良好特质。

1.1 访问控制

访问控制确保访问数据库的人员得到明确的标识,并且能够访问、更新或删除他们有权访问的数据。这是我们将在本文中讨论的主题。在数据库中,我们可以处理客户机的身份验证和它们希望执行的操作的授权。

1.2 认证

当客户机或用户访问数据库时,第一个任务是检查该用户是否是已知用户,并提供凭证以确保能够令人信服地识别他们,这就是所谓的身份验证。使用MongoDB,我们可以使用以下工具之一来处理认证问题。

1.2.1 内部工具

SCRAM:MongoDB默认身份验证机制。它根据用户名、密码来进行数据库身份验证。

x.509证书:该机制使用x.509证书代替用户名和密码。基于副本集或分片集群中的服务器或成员对客户机进行身份验证。维基百科上说:“x.509证书包含公钥和标识,由证书颁发机构或自签名,持有证书的人可以依赖证书所包含的公钥来建立安全通信”。

1.2.2 外部工具

LDAP:这个协议最常见的用途是提供一个中心服务器来存储用户名和密码,允许不同的应用程序连接到LDAP服务器来验证用户。

Kerberos:这是一个基于票据的行业标准认证协议。

注解:外部工具只在MongoDB企业版中提供。

作为一种最佳实践,我们将为需要访问数据库的每个实体创建登录凭据,但只针对这些实体。这样做,我们将能够审计所有用户所做的所有活动,并完成GDPR要求。除了用户身份验证之外,还需要对服务器和网络进程进行身份验证。在一套副本或分片集群的所有节点检查彼此不断为了确保都是已知的访问用户(换句话说,确认他们的会员),以及其他任务,比如检查每个成员的健康为了确定副本必须完成一次新的选举。那么什么是选举呢?在MongoDB中,只有一个节点能够执行写操作。当此节点关闭或网络部分开始工作时,其余节点开始进行一次选择,以便选择新的主节点并使服务在不停止的情况下运行。

1.3 授权

数据库管理员负责向用户授予或拒绝对数据库资源进行操作的权限。通过使用角色,我们可以指定对资源执行什么操作。因此,角色是授予用户使用特定资源执行特定任务的权限。

资源←动作←角色(权限)→用户

MongoDB提供内置角色,还允许您根据数据库的特定需求定义新的角色。这些角色是根据对资源的操作来定义的。动作是我们可以对数据库进行所有类型的操作,例如查找、删除、插入、更新或创建索引。资源可以是集合、文档、索引、数据库等等。使用只读视图,管理员通过限制对只公开其子集的敏感数据的访问来获得字段级安全性。对视图授予的权限与授予底层集合的权限是分开指定的。每个角色只应该为该角色授予必要的权限,并且只应该为用户分配适合其需求的角色。

1.4 数据库的身份验证

MongoDB用户必须使用最初创建它们的数据库来标识自己。这通常是管理数据库,但也可以是其他数据库。无论在哪个数据库上创建了用户,如果将适当的角色授予了用户,他们将能够对其他数据库采取操作。

2、MongoDB用户

在启用访问控制之前,应该创建一个用户,该用户可以在启用访问控制后创建用户并为用户分配角色。然后,这个用户管理员将用于创建和维护其他用户和角色,因此需要分配一个合适的角色来支持。如果你不创建此管理用户,则在启用访问控制时将无法登录或创建新用户和角色。

2.1 本地主机异常

如果在没有创建至少一个管理用户的情况下启用访问控制,则无法登录。localhost异常允许您在启用访问控制之后创建第一个用户,从而避免了这个问题。要做到这一点,你需要:

启用访问控制连接到localhost接口在管理数据库中创建第一个用户,该用户必须具有足够的权限来管理其他用户和角色。

这个localhost异常只适用于仍然没有创建用户的情况。您必须在两个选项中进行选择,在启用访问控制之前创建第一个用户,或者在启用访问控制之后使用localhost异常创建第一个用户。

2.2 如何启用访问控制

在启动mongod服务时,可以使用参数指定数据库的特性,或者更好的方法是使用配置文件。无论哪种方式,你都必须使用安全选项:

securityauthorization:enabled

此设置启用或禁用基于角色的访问控制(译者注:上面的配置是激活状态)。

2.3 如何创建用户

在创建MongoDB用户之前,有必要考虑一下用户将要执行的任务。可能会有几个具有相同权限级别的用户,所以最明智的选择是创建一个角色并将其分配给每个用户。通过只更改一个角色,您将更新所有使用它的用户的权限。否则,需要为每个用户对一组或一类用户的访问需求进行更改。操作步骤如下:

第一步:将上下文更改为要创建角色的数据库:

use admin

第二步:执行这个命令:

> db.createUser({user : '<userName>',pwd : '<password>', roles : [ { role : '<roleName>', db : '<dbName>' } | '<roleName>', …]})

如果您想创建一个用户而不为该用户分配任何角色,您只需指定一个空的roles字段。

注解:如果您还在掌握MongoDB查询语言,像MongoDB IDE Studio 3T这样的工具有一个直观的用户管理器特性,这使得用户管理更加直观和直观。

MongoDB IDE Studio 3T地址:

https://studio3t/

用户管理器地址:

https://studio3t/knowledge-base/articles/user-manager/

2.4 如何删除一个用户

假设您有合适的登陆角色并允许删除用户,您将需要将上下文更改到创建数据库的时候,

use admin

之后执行如下命令:

db.dropUser('<userName>')

2.5 用户存储在哪里?

要检查用户,必须将上下文更改为创建用户的数据库的情景,例如管理员数据库。

> use '<dbName>'

然后您可以使用其中之一

> db.systemers.find()

或者

> db.getUsers()

但是,如果您只想询问特定的用户,请使用以下命令:

> db.getUser('<userName>')

2.6 如何登陆?

有三种可能的情况,显然它们都有相同的哲学。让我们来看看:

2.6.1 在数据库内部

$ mongo> use '<dbName>'> db.auth('<userName>','<password>')

我不建议您使用此方法,因为在您键入密码时密码是可见的。

2.6.2 通过Shell脚本

$ mongo --authenticationDatabase <dbName> -u <userName> -pMongoDB shell version v3.6.4-rc0Enter password:connecting to: mongodb://127.0.0.1:27017MongoDB server version: 3.6.4-rc0MongoDB Enterprise >

这是我的首选。在本例中,如果不指定authenticationDatabase参数,数据库将始终尝试根据将要连接到的数据库对用户进行身份验证。如果我们不指定要连接的数据库名称,就像我在上面的示例中所做的那样,服务器将对“test”数据库执行此操作。

2.6.3 通过MongoDB客户端

从MongoDB客户端,我们必须使用这样的连接字符串:

mongo://<userName>:<password>@<hostName>:27017/<dbName>?options

2.7 怎样注销

注销结束当前身份验证会话。您必须在经过身份验证的同一数据库中执行此操作。

> use admin> db.logout()

3、MongoDB角色

正如您已经知道的,角色是授予用户对资源执行操作的特权。角色定义角色成员可以执行的任务,以及可以执行这些任务的资源。MongoDB为最常见的情景提供内置角色。但是,也允许我们根据自己的特定需求创建自己的角色。每个角色的作用域都限定在创建它的数据库中。角色只能包含应用于其数据库的特权,并且只能从其数据库中的其他角色继承特权。在管理数据库中创建的角色可以包含应用于管理数据库、其他数据库或集群资源的特权,还可以继承其他数据库和管理数据库中的角色。因此,如果需要从另一个数据库中创建的角色继承,则必须在管理数据库中创建新角色。

3.1 角色存储在哪里?

之前已经解释过,您可以在管理数据库或任何其他数据库中创建角色。因此,如果你想检查它们,你必须在定义它们的数据库中进行:

> use '<dbName>'

要获取数据库的所有角色,请使用

> db.system.roles.find()

或者

> db.getRoles()

如果你只想要一个特定的角色,你可以使用这个命令:

> use '<dbName>'> db.getRole('<roleName>')

3.2 内置的角色

MongoDB将内置角色分类为:

数据库用户角色数据库管理员角色集群管理员角色备份和恢复角色所有数据库角色超级用户角色

下面将详细介绍每一个角色。

3.2.1 数据库用户角色

数据库级别角色如下:

读——读取所有非系统集合上的数据读写——包括所有“读”角色特权和在所有非系统集合上写数据的能力

3.2.2 数据库管理员角色

可以使用的数据库管理员角色如下:

dbAdmin——授予执行管理任务的特权

userAdmin——允许您在当前数据库上创建和修改用户和角色

dbOwner——此角色结合了以下内容:

readWritedbAdminuserAdmin

3.2.3 集群管理员角色

用于管理整个系统的管理数据库中的角色。

clusterMonitor——提供对监视工具的只读访问

clusterManager——用于管理和监视集群上的操作

hostManager——监视和管理服务器

clusterAdmin——结合了其他三个角色和dropDatabase操作

3.2.4 备份和恢复角色

这个角色属于管理数据库。

backup——提供备份数据所需的特权

restore——提供从备份中还原数据所需的特权

3.2.5 所有数据库角色

这些角色位于管理数据库上,并提供适用于所有数据库的特权。

readAnyDatabase——与“read”角色相同,但适用于所有数据库

readWriteAnyDatabase——与“readWrite”角色相同,但适用于所有数据库

userAdminAnyDatabase——与‘userAdmin’角色相同,但适用于所有数据库

dbAdminAnyDatabase——与“dbAdmin”角色相同,但适用于所有数据库

3.2.6 超级用户角色

以下角色不是直接的超级用户角色,但是能够为任何用户分配任何数据库上的任何特权,也包括他们自己。

userAdmin

dbOwner

userAdminAnyDatabase

root角色提供对所有资源的完全特权:

root

3.3 如何检查角色的特权

如果需要知道角色的特权(是否从其他角色继承),可以通过 “showPrivileges”字段来进行激活:

> use '<dbName>'> db.getRole('<roleName>', { showPrivileges : true })

3.4 角色汇总

管理MongoDB资产的人必须为自己的用例找到最合适的角色。在我看来,以下角色通常是最有用的:

userAdminAnyDatabaseclusterManagerclusterMonitorbackuprestoredbAdminreadWriteread

3.5 如何授予用户角色

您可以在创建用户时授予角色,也可以在事后授予角色。下一个命令对于在创建用户的同时分配角色是有效的:

> use '<dbName>'> db.createUser({user: \"<userName>\",pwd: \"<password>\",roles: [ { role: \"<roleName>\", db: \"<dbName>\" } ]})

你也可以用这个命令:

> use '<dbName>'> db.grantRolesToUser('<userName>',[ { role : '<roleName>', db : '<dbName>' }, '<roleName>', … ])

注解:第三方MongoDB工具中的角色管理器之类的功能在这里非常方便,特别是如果您还在学习MongoDB查询语言的时候。

3.6 如何从用户撤消角色

> use '<dbName>'> db.revokeRolesFromUser('<userName>',[ { role : '<roleName>', db : '<dbname>' } | '<roleName>' ])

3.7 自定义用户角色

3.7.1 怎样创建一个自定义角色

> use '<dbName>'> db.createRole({role: \"<roleName>\",privileges: [{ resource: { db : “<dbName>”,collection : “<collectionName>” },actions: [ '<actionName>' ]}],roles: [ { role : '<fatherRoleName>', db : '<dbName>'} | '<roleName>' ]})

3.7.2 怎样删除一个自定义角色

> use '<dbName>'> db.dropRole('<roleName>')

3.7.3 如何授予或撤消自定义角色

这些命令是给自定义用户授予和撤销角色:

方案一:

> use '<dbName>'> db.grantPrivilegesToRole('<roleName>',[{ resource : { db : '<dbName>', collection : '<collectionName'> },actions : [ '<actionName>',... ]}, ...])

方案二:

> db.revokePrivilegesFromRole('<roleName>',[{ resource : { db : '<dbName>', collection : '<collectionName'> },actions : [ '<actionName>',... ]},…])

3.7.4 对自定义用户角色怎样授予和撤销

方案一:

> use '<dbName>'> db.grantRolesToRole('<roleName>',[ { role : '<roleName>', db : '<dbName>' } | <roles> ])

方案二:

> db.revokeRolesFromRole('<roleName>',[ { role : '<roleName>', db : '<dbName>' } | <roles> ])

3.8 怎样更新一个角色

小心!正如文档所述:“特权或角色数组的更新将完全替换前一个数组的值”。

> use '<dbName>'> db.updateRole('<roleName>',{privileges : [{resource : { db : '<dbName>', collection : '<collectionName>' },actions : [ '<actionName>' ]},...],roles : [ { role : '<roleName>', db : '<dbName>' } | '<roleName>' ]})

注解:您刚刚完成了MongoDB用户和角色解释系列的前半部分,MongoDB用户和角色解释系列的后半部分将了解如何在一个包含三个数据的节点副本集中启用访问控制,创建第一个使用localhost异常的用户,并授予所需的角色。敬请期待~~~

原文作者:Juan Roy Couto

Juan为了让自己成为目前MongoDB大师之一(

https://www.mongodb/community/masters

)。他获得了MongoDB认证,DBA和DEV。目前,他的工作角色是MongoDB数据库工程师。在此之前,在多家金融公司做了20年的开发。他喜欢与皇马的马克杯合作,也喜欢与技术社区交流。你可以在twitter/juanroycouto上阅读他的文章。

译者:管祥青

湖南大学研究生毕业,毕业后在海康威视研究院从事大数据研发及机器学习相关工作,现在就职于一家大数据金融公司。

一组两人,日入1000美金(tk超级保姆级教程全套2万字版)

前言

做tiktok这个项目已经快有两年时间了,期间平台规则各种大改赚过,也亏过,但就在最近五个月,手底下六个TikTok的项目组开始稳定盈利,平均两到三个人,单日就能做出1000美金的收益,注意,这里是收益,而不是销售额,综合收益还是蛮高的。很多人就会好奇,为什么TikTok这么赚钱,做的人却不多呢?那兄弟你且看我下面整整2万字的项目教程你就能明白了。这份教程没有那么细,但也是你能不花钱看到的最细的TikTok教程了。只要根据所讲的一步一步去完成,赚到钱还是很容易的。

一、关于TikTok

TikTok是2017年5月发布的,2021年4月TikTok Shop开放英国区本土小店,2021年6月TikTok Shop开放跨境店;2022年上半年整体GMV已突破10亿美金,与其在2021年全年的体量相当,其中印尼市场交易额占比最大,最高月均GMV达2亿美金;英国市场月均达2400万美元。

TikTok的环境更加开放,市场也更广。可以覆盖到全球的用户,据了解,TIKTOK定下了5年内实现4700亿美金(将近3万亿人民币)GMV的目标。也足以看到字节的野心和决心。

而TikTok对于新手来说,入局的门槛也是比较低的。只需要可以使用英语与外国人无障碍的沟通,每天有2-6小时直播。在准备几千块钱用来布置直播间场景和购买设备以及样品等。而且直播是具有规模化和可持续性的。和短视频不同的是,短视频可能突然有一天爆了,出了不少单,但是这是很难预测和控制的,而且短视频的转化会比较低。直播是可以和主播有互动的,用户对于直播间也会产生一定的粘性,直播这周出了几百单,下周即便是下滑也不会是一单都没有,这就给了运营有足够的时间可以去调整,而且官方对于商家的物流扶持,货补政策也是推进力度极大的。

虽然TikTok的流量精准度仍然需要一点时间,但是相信有抖音这样一个已经完成闭环的模型在前方作为案例。TK也可以稳步向前追赶的。

二、TK常见的变现方式2.1 付费流量TikTok ADSBTT模式豆荚模式2.2 免费流量TikTok创作者基金TikTok电商模式TikTok直播模式TikTok Affiliate模式TikTok广告联盟模式TikTok私域聊单模式2.3 其它TikTok培训TikTok辅助工具TikTok代运营&卖号

因为本文主要讲解的是短视频和直播以及私域,所以本章节就不详细说了。如果感兴趣的人多,后面可以单独更新一篇是以上变现方式比较详细的讲解。

三、前期准备

之前看到过一个故事还是采访,大致的内容说的是埃隆马斯克是如何将火箭成本降到十分之一的,主要的一点是离不开他会分解目标。对于普通人来说是无法想象的事情,却被他完成了。讲这个故事不是为了让大家去造火箭,只是这其中蕴含着科学且有意思的管理方法。

OKR制度和ART原则,这里我就不细述了。感兴趣的可以自己去搜索了解,大致的意思是我们要明确一个目标,然后拆分成一个又一个可执行可量化的步骤。通过目标的聚焦,标尺的建立,复盘的习惯。让成功的概率变得大大提高了。无论对于个人还是对于刚要起步的团队都十分的重要。切记团队不可目标不明确不统一,大家达成共识拧成一股绳才有机会砸出水花,不然一盘散沙,难成大事。

那对于刚入局的小白来说,首先要对TK有一个大纲式、框架式的了解,这样做TK这个抽象的事情就变成了:要选品、要搭建网络环境、要准备资料、要准备短视频、要搭建直播间,等等等等这样具体的事情。然后根据自己或者团队的能力以及偏好去猛攻有优势的方向。

3.1 准备工作准备手机

苹果手机 最好是iPhone7以上的,不会刷机的话,刷机资料可以私信我获取。需要注意的一些点和如何设置在下方。

安卓手机可以直接在我「公众号:小宇录」后台回复「抖音」或者「TikTok」就会有安卓版本的破解app了,不需要拔卡。

iOS在手机上的设置拔掉电话卡恢复出厂设置(建议刷机)关闭定位打开限制广告跟踪iOS14需关闭个性化广告修改语言为对应网络地址的语言修改时区为对应网络地址的时区修改地区为对应网络地址的地区需要注意的点节点IP地址和时间和语言都需要一致对应,否则伪装度会没有100。下载小火箭 Shadowrocket 需要美区ID准备邮箱

outlook邮箱可以直接自己注册,账号比较少的话就直接用这个就好了,提前注册几个备用,我们都是用的outlook邮箱。没有一点问题。

Gmail邮箱自己注册好像比较麻烦,据我接触下来,一些做自动批量矩阵的玩家都是直接购买的邮箱,反正也便宜。能花小钱解决的事情,就不要自己折腾了,不然浪费时间可能后面还有其它的问题。

准备账号

这里准备分成两块来准备,一个是Shopify独立站一个是TikTok小店。因为有的同学可能是不做Shopify的就不需要准备这些。

TikTok shoppayoneer 派安盈(p卡,官方指定收款渠道,早期亚马逊官方推荐的收款平台,最早一批做跨境收款平台之一,注册后用来给店铺收款用。注册流程可以看在歪猫跨境的教程,站长写的非常详细。)shopify独立站

这里是以Shopify来举例,独立站还有很多的平台,大家也不一定要用Shopify,有国内的一些独立站平台也是很不错的,还有中文客服可以对接解决问题。

注册PayPal账户 (用来收款独立站的,企业账户还挺麻烦的,需要提早做好准备,还有一点是PayPal新号很容易被封禁。)注册店小秘(订单处理erp,要连接Shopify和物流系统的,当然,用其它的erp也是可以的。不过店小秘是免费的,还是值得推荐的。)四、选品

行业中一句话叫”七分靠选品,三分靠运营“

在我刚接触这个行业的时候,我的理解是万事万物,既然存在必定合理。不管什么产品,什么价格,都会有想要的和需要的人。我们要做的是把产品和需要的人建立连接。只要前端有大流量,那最终在漏斗模型中,一定会有成交。

后来明白选品是电商带货项目里的重中之重,也是一个非常考验技巧和经验的一环。选品选的好,后面的每一步都会走的比较轻松。

产品有趣、有用、或者便宜,用户才会感兴趣将视频看完或者在直播间停留,从而完成下单。是总得需要有一个点可以打动用户的。因为有人下单,所以平台算法觉得这个直播间或者这个视频有人喜欢,从而推送到更大的流量池中。这样漏斗模型就形成了一个闭环。有初使流量,观看,点击,成交,推送流量,观看,点击,成交,继续推送流量.......

而不是我们非要把一件特别小众的东西,强硬的卖给不需要的大众。我们又不是厂家还是什么,选择的机会少,想重新开生产线比较复杂。我们只是赚取差价的人,最终的目的也是为了赚钱,所以不应该什么好卖就应该卖什么吗?

不过小众产品如果卖爆确实也是非常不错的,因为这个是一个小的赛道,没有那么多人和你竞争。但是如果没做出来的呢?对于公司和个人来说就都变成了。

我们作为刚入局的玩家来说,首先要做的是挑选容易卖的品,完成整个流程实现从0到1形成一个闭环,才是最重要的一点。这样有正反馈了,就可以不断的优化和迭代每一步的流程,团队的成员也会有信心和激励。

4.1 选品思路

首先,我们要理解的是,TikTok上的用户在使用TikTok的时候,往往是处于娱乐消遣的状态,而并非是购物的状态。这意味着,你如果想要从众多的竞争中脱颖而出,一定要有非常强烈的与众不同的独特价值,能够让人看到就眼前一亮,产生购买的冲动。

冲动就是围绕TikTok选品最显著的特征!

4.2 初级选品攻略

卖货最重要的是了解目标消费者的心理,需要根据自己的产品特征来反推消费者的需求,所以发布视频内容,要充分围绕货物进行展示,内容垂直度非常高,并且通过视频字幕,标题来引导用户,告诉他去哪里购买。

而定位和选品,其实就是回答3个问题:

面向什么人群通过提供什么样的服务,解决什么样的问题卖给目标用户什么产品

前两个问题是回答定位,第三个问题是回答选品。

最基础的三步走是:

第一步:先确定一个自己想要做的目标用户人群第二步:找这个目标用户人群他们的需求第三步:然后细分类目,根据各种方法找到匹配高的产品

在具体的选品之前,还需要对TikTok的选品思路有一个大概的框架,具体有以下6个方面:

4.2.1 金额

一般选择10-60美金的商品。因为10美金以下的商品利润空间比较低,往往物流成本就会占去很大一部分,而60美金以上的商品由于高客单价,在TikTok上的转化率较差,毕竟TikTok整体的商业环境还不成熟,还没有培养好用户在TikTok上购买商品的习惯。

4.2.2 物流时效

这个主要针对做Drop shipping(一件代发)模式的商家。如果发货时间过长会影响用户的体验,从而会有客诉或者差评。产生客诉,客诉最直接影响的便是收款账户。如果因为等待期过长用户选择退货,那成本随之也会上升,会很难把控。

独立站交易监管的是收款账号,容易造成资金流的问题 做TikTok电商,往往使用的是独立站(shopify,wordpress等),而不是第三方平台(亚马逊,ebay等)。开设一个独立站非常方便,可以直接0元开店,也不需要像入驻平台一样缴纳一定的保证金,所以独立站比较难监管。而且独立站交易监管的是收款账号,如果产生客诉,就是投诉到收款账号中,例如PayPal账号,stripe账号,直接在收款账号中冻结你的资金,这就容易造成资金流的问题.

做TikTok小店对物流时效会管控的更加严格,扣店铺分,严重的封店或者一天只能卖出一单。

TikTok官方合作的物流是万色物流,但是因为很多城市没有万色的揽收点,需要商家先把商品寄给万色仓库然后他们在发出。这个过程又会增加了时效,一定需要注意把控好。

4.2.3 市场规模

新手玩家,建议在初期选品时选择市场规模较大的产品,先通过市场规模较大的产品了解TikTok这个平台用户特点,等选品经验较为丰富之后,再寻找其它产品。

4.2.4 目标受众

TikTok用户中,60%的客户年龄在30岁以下,指向年轻人群,但年轻人往往还带着另一个标签——消费力相对较弱,所以不建议在TikTok上卖高客单价产品的原因之一。

4.2.5 市场上是否容易买到

TikTok短视频带货的产品往往具有新奇特属性,这是因为新奇特的商品市面上比较少见,容易激发大家的兴趣,不仅可以吸引到更多的观众,同时也有利于转化。

设想一个场景,假如你在刷抖音,发现抖音上有一个蛮不错的商品,转念一想,这个商品楼下便利店有,价格还差不多,那一般都不会选择在抖音上买。

所以,要选择一些市面上不那么好买到的具有新奇特属性的产品。

4.2.6 顾客价格敏感度

用户在刷TikTok时,其实并不想买东西,可能只是想消遣一下(如果想买东西,会有针对性地去购物平台,俗称「人找货」),但短视频带货,则是在他没有购买目的时将商品卖给他,俗称「货找人」。

所以TikTok带货,往往都需要借助顾客的冲动消费心理。如果顾客对商品价格过于敏感,那么会极大的削弱消费的冲动。

举个例子:

当你走在繁华的大街上,口渴了,想去便利店买一瓶农夫山泉,大众认知的价格是2元/瓶,但便利店却售价4元/瓶,我想大部分人会出门左拐去买2元,因为对于农夫山泉矿泉水这件商品,顾客的价格敏感度是很高的,价格稍有波动,客户便会不买账。

如果我们换个商品,假如要买一根手机充电线,多数人会觉得10元/根左右差不多,但如果你走进一家手机店,他说这根数据线18元/根,我想大部分人会觉得还行,不会像4块钱的农夫山泉那样难以接受。

什么样的商品具有低价格敏感度呢?可以关注以下几个方向:

商品价格认知区间较大:美妆用品,3c配件商品的独特程度高:猫爪杯,新奇特小夜灯商品用途广但便宜:多功能剪刀商品的可对比性低:zippo打火机商品或服务的转换成本高:这里讲的是可以建立护城河的产品。

例如团队的产品是app或者自己有工厂做自己的产品,然后想办法去建立顾客的转换成本,让顾客用了你的产品之后很难再去用其它品牌的同类产品。

举个例子:

我们用微信用了很久了,假如有一天微信更新了新功能,让我们觉得很难用,此时我们会果断的放弃微信选择QQ吗?一般不会,因为放弃微信意味着放弃了微信上所有联系人的联系方式,需要非常大的转换成本,而此时客户便没有那么容易放弃这个产品了。

4.3 进阶选品攻略4.3.1 视觉选品法

这是短视频乃至跨境电商领域都非常常用的选品方法,其原理非常简单,就是一句话——可以给人眼前一亮的惊喜感(除了好看啥用没有)。爱美之心人皆有之,无论古今,无论中外,所以在很多时候。

好看,就是价值。

最近经常在TK上刷到一拍就亮的小夜灯,配合音乐卡点,流量很高,似乎那个团队也起了矩阵。还有之前的爆款日落灯。

4.3.2 认知选品法

这类选品方法很多人做,因为确实很容易做出爆款,但还是不太建议做,因为认知形选品法的主要原理是:

混淆概念卖家与消费者之间在某件事物上存在认知差赋予商品额外的价值

举个例子:有段时间束腰带非常火爆,不管是国内还是国外,众多网红都在不遗余力的种草推荐。而这款产品被赋予的价值就是瘦腰,减肥。但其实束腰带最早是出现在产房里的一个产后修复工具,这就是认知差带来的效益。

而商家怎么宣传呢?「带上我们的束腰带,只需要坚持运动1个月,即可减肥成功。」这句话的关键词是「运动」和「一个月」,商家所宣传的价值往往短时间内无法达到效果,同时其影响因素也比较多,例如运动,饮食等。如果戴上之后没有效果,商家会说没到1个月,到了1个月没效果,商家会说你没有科学运动,没有规范饮食。

4.3.3 趋势选品法

这类选品法需要卖家对时事要闻,市场趋势特别敏感,嗅觉特别敏锐。这就要求我们多关注海外的新闻,热门的社交媒体等,同时不仅要保持信息畅通,还要具备一定的处理信息能力,应该深入思考,细心挖掘。

举个例子:之前有一则新闻——使用塑料吸管会被罚款,两个关键词「塑料」和「吸管」。假如我们足够敏锐,就可以做纸吸管,不锈钢吸管,甚至不做吸管,而是做一个可以直接喝的一次性杯盖。

假如我们的嗅觉没有那么敏锐,没有第一时间捕捉到这个商机,不锈钢吸管已经有头部卖家了,很难竞争,可又不想错过这次趋势,那就做跟卖——不是说简单粗暴的跟卖一摸一样的产品,而是在已有的基础上去做出一些创新,做成彩色的,做成伸缩便携的等,创意是无穷无尽的。

4.3.4 实用选品法

这个方法和视觉选品法号称占据了TikTok电商选品的大半个江山,它往往关注的是解决问题,一个产品到底能不能切切实实帮助消费者解决某一类问题,而不像视觉选品法中的选的只是好看的「花瓶」。

拍摄实用型选品五步法

第一步:展示观众痛点

第二步:产品是什么?

第三步:产品怎么用?

第四步:产品用在哪?

第五步:用完有什么效果?

4.3.5 热点选品法

使用这个方法,要对时政要闻的嗅觉更加敏锐,这与趋势选品法类似,但又有所差别;趋势选品法的产品是未来长久之计的趋势,例如大屏智能手机问世,无法更换电池,那么充电宝将会成为趋势;热点选品法的产品往往就是一波,时效非常短暂,热点过去之后,产品的热度也会随之下降。

需要强调的一点是,热点选品法始终是昙花一现,不要过分追逐,也无需把大量的精力放在这上面,要抱着如果哪一天踩中了一个热点型的爆品,就当中了彩票的心态去做。

举个例子:2020年美国的黑人社群暴动是非常大的热点,当时大家的人身安全防范意识增强,每个人都觉得配Q才安全,这时候我们就可以思考,针对这个热点可以卖什么东西?最直接的就是卖Q,但是显然是不可能的,违法的事情坚決不能干。这时候就可以发散思维了,能不能卖Q支周边产品?这就应运而生了一个爆款产品:隐形QT恤。

4.3.6 利基选品法

利基市场,指的是在较大的细分市场中具有相似兴趣或需求的一小群顾客所占有的市场空间,说人话就是一个规模很小但确实有需求的细分市场。

利基型的产品往往有以下几个优势:

很容易成为头部的top1,top2成为top1,top2之后比较容易建立壁垒市场容量有限,不会有大量竞争者,建立壁垒之后可以长期享受利基市场带来的红利

但利基型产品的一个弊端就是:由于市场规模有限,无法短时间大规模起量,只能细水长流。

举个例子:宠物墓碑

宠物在人类生活中已经成了不可或缺的一部分,当宠物去世后,很多家庭愿意为它们设立墓碑,表示纪念,这就是一个非常好的需求点。通过调研会发现,这个需求并不是大量的,而是宠物用品中非常小的领域,所以可以集中力量抢占头部位置,享受长期红利。

细心的小伙伴会发现,我们在初级选品框架中讲到,选品应该是选市场规模大的品,这里又跟大家说可以选利基市场的品,这不是互相矛盾吗?其实不是。

利基市场选品需要对市场有着足够的洞察,才能找到好的切入口,如果盲目进入很容易碰壁,所以在我们初入TikTok电商或跨境的时候,建议大家从市场规模大的商品开始入手,由浅入深,稳步前进。

五、网络环境5.1 名词解释

模拟海外的上网环境,往往是依靠代理服务器将我们的IP节点伪装成对应目标国家的IP节点来实现,因此有一条安全稳定的上网线路和 IP 节点就显得尤为重要。

机场

机场,就是由某些服务商通过租用海外服务器搭建好上网线路和节点,再以套餐计费或者流量计费的方式共享出售给普通的消费者。既然是共享,一些小机场就不可避免的,会出现网络拥堵或不稳定的情况。具体到 TikTok 的运营来说,可能就是由于共享 IP 的某一个人的账号被 TikTok 识别出来,不是正常的海外用户内容,也是搬运和抄袭,导致其他使用相同 IP 节点的用户受到牵连。

静态IP

IP地址是固定的,不会来回变换,可以隔一段时间测试一下IP地址。

原生IP

就是你的IP注册地址和服务器机房所在的地址是一致的。

自建节点

自己去租用海外服务器,自己选线路,自己搭建上网节点。不依靠机场的服务商自建的IP节点,就不太会有很多人共享的问题。那并不能说明一定就会很稳定,因为可能很快就会发现你的IP被g墙封了。

因为g墙已经将这些主流的海外服务器供应商进行了重点监控,所以还没等到t到来查你,你就已经被强拦截下来了,所以对于很多新手来说,自己去摸索和尝试自建IP节点可能得不偿失,不如找一个稳定的机场节点来得实在。当然如果你本身是技术控,对网络通讯知识也比较了解,可以去尝试。

一些服务商不支持换节点的,如果被强了就需要重新购买服务器。有的是会单独收更换节点的费用。

软路由

软路由就是经过改造的路由器和市面上买到的民用商用的路由器不同,往往性能极佳一台软路由可以理解为一台小型的计算机,甚至可以在上面安装操作系统,软路由和路由器翻q一样,也可以拖家带口的实现家里所有的网络设备翻q。不仅限只能代理应用层的流量性能,又相比普通的路由器要好,软路由的缺点就是价格稍贵。

网关模式翻q

可以理解为不需要一个专属的设备,而是通过一台计算机上面跑的软件来实现路由器的功能,有一点像更软的软路由,有代表性的就是windows下flash或者MAC系统下的search,这种翻q方式可以接管局域网内所有设备,同时翻q包括解决了刚刚提到的有些软件流量不遵循系统代理规则,不走翻q软件的问题,同时它操作异常方便,无论是切换节点还是调试都比路由器或者软路由的效率来的要更高,因为我们直接操作的是电脑上面的软件,而不是路由器后台。

TIKTOK直播专线

在tiktok上直播就要求我们的线路做到低时延和非常的稳定,总不能一卡一卡的直播,或者有随时掉线的风险,然后只能下播。

专线这个解释起来比较复杂,总之就是最好的就是直播专线,可以规避被墙以及可以做到低时延。但是价格也会比较高,一般大的机场服务商会有渠道和资质可以直接向电信联通的二级经销商购买线路自然就会便宜一些。

软件FQ

我们绝大多数普通人基本上用的都是软件的FQ方式,通过下载 shadrocket (小火箭)clash这样的APP配置好我们的上网节点。

路由器FQ

路由器FQ可以简单理解为把翻FQ软件部署在的路由器上面,那么连接路由器的所有设备就可以一起翻q

路由器FQ相比软件FQ有一个明显的优点,那就是可以应用于那些无法安装FQ软件的网络设备比,如Apple TV、Xbox等等。缺点就是路由器的CPU算力一般比较小,可能会导致网络的卡顿情况,

其它

因梯子较为敏感,这里不做详细讲解,大家可自行找渠道和方案。所以这里只把做TK过程中关于网络方面的词汇做一个解释。以免在听到这些词的时候懵逼,不知道怎么选择。

六、TK小店

因为申请小店以及官方规则都是一直在变化中的,所以注册小店这些我会简单带过。具体的在TikTok shop看官方的公告或者飞书官方群了解就可以了。

6.1 小店的类型

主要分为跨境小店和本土小店,而我们主要做的就是跨境小店。

跨境小店又分为欧洲市场和东南亚市场

欧洲市场就是目前主流的英国小店,一般都是先开通英国小店然后达到要求后申请定邀二店或者全球市场。

东南亚市场就是泰国、越南、马来西亚、菲律宾、新加坡

申请小店非常麻烦,有的时候要求会非常严格需要等很久,申请好之后还需要缴纳高额的保证金。

大家也可以通过挂靠mcn的方式,让整个项目先启动起来。

最重要的就是整个流程先跑通。先赚到1块钱。

6.2 收款

TikTok上的收款是用的payoneer,官方指定的收款方式,只能用这个。

这里有个小tips,大家可以先注册payoneer,因为payoneer有一个叫做“橄榄枝计划”的东西,就是从payoneer的渠道申请TikTokshop,速度比直接从官方渠道申请快多了。

不过这里申请的是普店哦,定邀的话只能走其它渠道了。

6.3 物流

TK小店的物流也是官方指定的,万色速递

6.4 其它

其它对于TikTok小店来说已经没啥好说的了,官方的文档和课程。以及飞书上的资料真的超级详细,真的挺佩服TikTok的运营的,各种案例和方法。

有了大致的框架和了解了之后,就可以根据关键词去搜索官方的资料就可以了。我这里就不需要再说了,不然整篇文章会变得更加非常冗长。

七、Shopify独立站7.1 收款

收款是在做跨境电商中重中之重的事情,不然即便你卖了10万100万,钱提不出来那也不是你的。

7.1.1 PayPal

一般来说都会先注册一个PayPal来使用,但是PayPal太容易被封了,如果是正规的经营的话,只需要提交自己合规经营的资料,上传几次然后养养号,随着后面的订单稳定,账号也会不容易出问题。但是前期很折磨。

PayPal收款不会产生信用卡收款手续费,但是PayPal会有PayPal的收款手续费:4.4%+0.3美金。比如订单A是100美金,那订单A产生的PayPal收款手续费为 100*4.4%+0.3=4.7美金。

7.1.2 oceanpayment钱海报价是2000接入费+5000年费优势是支持的支付方式挺多的7.1.3 空中云汇需要香港公司

包括Shopify payments还有派安盈收款独立站都是需要国外的公司或者香港的营业执照。

其它的我就不一一介绍了,我会在第十一章放上几个跨境和做TK电商常用的导航页,授人以鱼不如授人以渔。大家要做好自己的研究,选择适合自己的就好。

7.1.4 AB站收款*

用户看到的是A站,也就是我们所卖的特殊产品,但是用户在支付的时候会跳转到B站支付,B站上的都是一些普货,用户除了支付的时候会跳转到B站,其他时候是无法接触到B站的。

因为有些特殊产品通过Paypal收款容易被封,信用卡渠道不敢收,这种情况下就有大佬研究出了AB站的玩法。

这样Paypal里的收款记录,也只会显示用户购买的是B站的产品,一般1个A站对应50或者100个B站,再加上几个Paypal或者信用卡收单渠道轮流收款,把收款风险降到最低。

7.2 物流

BTD国际物流、递四方、极兔国际、顺丰国际、飞兔国际、万色速递、燕文物流、云途物流....

物流真的是太多了,主要的差别就是时效,基础费用,自己所在的城市是否有揽收等等。不过还是建议大家选择大的物流公司更加稳妥一些。

一般刚入局的玩家在加官方群或者一些社群的时候会发现很多打广告的都是物流和节点。做好辨别即可。TikTokshop只走万色。

7.3 独立站玩法7.3.1 爆品站

爆品站的优势在于我们可以在同一个网站上传几十上百甚至上千种不同类型的产品,让我们可以去快速地测试产品,而不需要重复建站,节省非常多时间。当然,爆品站的劣势就是在于获取客户信任方面,会低于垂直站或者单品站。

虽然到目前为止依然有不少卖家依靠爆品站也能赚取到不错的订单,但是从个人的经验来看,垂直站或者单品站的成功的几率要更多。因此,建议当你一旦通过爆品站测品方法选到不错的产品,可以在第一时间围绕你的产品创建一个垂直站或者单品站来尽可能转化潜在客户订单。

7.3.2 垂直站

垂直站,虽然和爆品站一样可以上架很多产品,但是这些产品往往都是属于同一个垂直类目或者市场,垂直站的好处在于,我们后期可以比较容易地将一个垂直站逐渐转化一个品牌,也可以向客户upsell其它一些可能他会感兴趣的产品。

其次,创建垂直站同样可以节省我们的一部分时间。当某个垂直类目下的产品无法获得很好的投入产出比时,我们不必重新搭建网站,而是可以迅速切换另一个同样类目的产品进行测试。不过,我们同样也需要清楚,垂直站处于爆品站和单品站中间,它的弊端就是既无法像爆品站一样高效大量地测品,也无法获得像单品站一样的品牌信任。作为新手来说,除非有特别的原因,否则会更推荐大家优先从爆品站和单品站开始着手尝试。

7.3.3 单品站

单品站是我认为目前和TikTok广告投放结合的最好的一种网站形式

在过去一段时间的测品结果来看,单品站的转化效率往往要高于一般的爆品站。单品站最大的缺点就是测试效率低,重复建站非常耗费心力,但最终这都是值得的。

如果想快速建立正反馈,先在TikTok上找到带货的手感,推荐可以和已经有独立站的人合作,你来引流,他来做承接,赚取带货佣金。

7.4 独立站运营

点击可以看大图

模仿是最好的老师,如果是想做好独立站的,可以仔细看看这张导图。

不管是Instagram还是Facebook还是TikTok的短视频或者直播或者是私域,所有的这些平台,都只是引流渠道之一。

最终的目的是引流到私域或者独立站然后完成成交。这样整个流程从大的框架来说就被分为了三步,引流+私域+独立站成交。

这张导图主要是讲解站内分析和站外的分析一些方法和思路,怎么去寻找对标的独立站,我们甚至还可以通过SEO的优化方式,来增加自己独立站在搜索网址的排名。也可以吸引到一部分流量。那这想象空间也是极大的。

八、私域8.1 私域是什么?

公域流量和私域流量的区别,举一个例子,像亚马逊、Tik Tok、google这些是属于平台流量,是公共的。

甚至公域流量是要付费的,比如百度、google、FB,如果你去搜索某个关键词,展示在面前的是围绕这个关键词的自然排名展示和竞价排名展示。

而私域流量相反,他是属于一个相对封闭的用户池,是我们自己的资源,可以自己支配反复利用。

TikTok是巨额流量平台,在过去的一到两年内,TikTok成为了火爆全球的社交平台,月活用户破10亿,甚至超越了Facebook和instagram等传统社媒巨头。

在巨额的免费流量面前,私域的玩法就应运而生。

TikTok中的私域玩法,就是我们利用短视频或直播流量的爆光,把用户引流到自己搭建好的Line、WhatsApp、Facebook、Instagram等社群工具中,直接拥有可重复、低成本甚至免费接触到的用户,通过私域经营与用户形成长期关系,通过一系列的产品介绍、话术引导最终达成交易。

目前Tk里的主流玩法,还是独立站或者小店等传统的带货形式,但是随着Tk逐渐闭环以及跨境店刚推出的高额保证金,部分类目的保证金高达4000英锈(折合人民币32000)。在英国小店的消费习惯尚未完全养成,东南亚小店的客单价较低、独立站视频转化、复购低的情况下,私域玩法的优势就体现出来了:

池塘竞争小,用户不好比价利润空间大,赚多少钱自己说了算复购性强,长期收益发展代理,躺着收单

私域相当于我们从大海里抓鱼往自己的池塘里放,养到一定程度就可以把鱼卖了,或者大鱼生小鱼产生价值。

独立站和小店大部分就是一锤子买卖,很难把用户沉淀下来,复购率也较低。但是私域不一样,只要产品、服务质量够硬,那复购是杠杠的。比如我们卖一个手表,成本400元,通过私域卖出去就是400刀甚至更高。

8.2 私域卖什么?

因为流量引进私域后,我们需要与用户建立信任,这个过程通常是需要花大量时间,尤其是当询问用户多的时候。

所以我们的产品利润需要足够高才能涵盖掉人工成本,通常这类产品的特点就是信息差、资源差、高溢价、高复购。

举几个例子:

高客单产品:3C、奢侈品(包包、鞋子、手表)

高复购产品:成隐性产品(电子y、q趣用品)

定制类产品:涂鸦鞋

信仰类产品:塔罗牌、佛珠手串、转运水晶

8.3 TikTok怎么引流到私域?8.3.1 短视频内容

Tik Tok是个短视频平台,最主要的流量来源就是视频流量,这里就需要决定好视频的表现方式。

例如:想包装成工厂,那你的内容就可以是工厂流水线,突出你的专业和产品的多样性、独特性,这样吸引过来的B端用户就会比较多;如果希望吸引到更多C端用户,就更多展示产品细节方面,多运用一些夸张、搞怪的方式吸引用户眼球。

因为短视频在你破流量圈以后面向的是全球的用户,所以短视频也是绝大部分人接触私域最快的途径。内容也需要根据产品,以及平台生态进行改变,如果只是简单的展示产品,其实是很难吸引到用户的。

下面给大家展示几个短视频内容案例:

A、直击痛点

做过短视频的小伙伴们都知道,短视频有黄金三秒原则。在短视频前几秒就抓住用户的眼球和脑子,直接告诉用户,我的产品就是为了解决你的XX问题而生的,只要用了我的产品,你的问题迎刃而解。

TK短视频带货讲究的就是新、奇、特,最早的做泡泡Q和玩具Q的时候,就是靠新奇特爆单的。

做奢侈品私域引流的时候,是把很多包包放在一个大箱子里,说这是“邻居“托我给他买的包包盲盒,观众会因为好奇而引发停留,后续在视频里留下钩子“如果你也想要的话可以找我。

B、颠覆认知

颠覆认知就是一样产品的质量、价格、使用方法等特征,与用户脑子里已有的概念完全相反。

举个例子:一样产品在老外眼中本身是很贵的或是平时负担不起的,但是你的价格却远低于他们认知中的价格,用户的求知欲就很容易驱使他们来了解你的产品。

C、强烈反差

产品使用前后差异,就像在TikTok上很火的一抹白,减肥药这些产品,他的一个产品公式就是“使用前状态+展示介绍产品+怎么使用+使用后效果”,强烈的反差能让用户产生好奇。

如果刚好用户也有这种困扰,他们就会在评论区寻找是否有用过的人,这时候我们只要做好钩子和控评,当用户产生一定信任感的时候就会主动加你。

D、讲故事立人设

很多老外都很爱听故事,很多老外在TK上卖的好的,并不是他的产品有多好,而是他的故事讲得好。

比如@woofpalace和@Investmentjoy这两个账号,他们两个简直就是tk届讲故事变现天花板。

前者主要做的是宠物定制项链,通过短视频讲述自己如何在TikTok上经营她“SmallBussiness”,把日常接到的订单和顾客与爱宠之间的故事制作感人短视频,以及因为受到亚马逊等同类产品竞争导致自已的生意受到了冲击快破产了(卖惨),成功在TK上收获了50多万粉丝以及数不清的订单;

后者是通过教人赚钱的课程方式,往自己私域引流推销自助饮料机、洗衣机项目,可以看到他的作品和作品封面全都离不开钱,视频内容都是讲述自己如何赚钱以及每次收钱的,他的简介里也说自己是从poorkid(穷小孩)成长起来的,贴近大众的同时无形中又立了个人设。

E、衍生内容

例如做佛珠手串,其实主打的是宗教信仰

平时发布的,就可以是关于佛教文化的起源与传播过程,可以打着信仰的名义,将用户引导进我们的圈子慢慢转化,在圈子中我们平时发布的手串可以与佛教的典故结合,再附上一张开光证,信仰值直接拉满。

当然以上都只是列举了一些典型案例,每种方法都是可以叠加的,例如直击痛点+强烈反差+颠覆认知,这也是目前大部分带货产品所采用的公式。

8.3.2 评论区截流

大家在抖音上应该经常有刷到,在一些大V的视频评论下经常有热评,我们可以在这些热评下面进行留言,这样也能获取到一定的曝光量。

经常说的“神评论”,逻辑一样也是为了获得更多的曝光。

8.3.3 互关私信

目前TikTok的私信功能,要求必须两个人互关才能私信。

我们可以跑去一些相关视频下方,寻找一些有意愿购买的人群关注他,或是关注同类对标账号的粉丝。老外一般是有回关的习惯,大概十个人里面能有两三个回关。

等用户回关之后,我们就可以把自己的自我介绍以及联系方式发送给对方

8.3.4 直播引流

直播间可以和用户高互动,主页挂上链接,直播间介绍产品,通过背景板和直播间贴纸引导用户联系主页客服下单。

8.3.5 标签推荐

在发布视频的过程中,我们可以自行添加视频标签,这样用户在搜索框里搜索的时候,我们的视频就会比其他没有添加标签的同行视频排名靠前。

以上的方式都是TikTok的流量入口,这些渠道流量大小排序大概是短视频>直播>互关私信>评论区截流>标签推荐。

8.4 如何在私域做成交?8.4.1 私域工具WeChat「海外华人」Line「台湾、日本」kakao talk「韩国」WhatsApp「欧美、东南亚」Instagram「全球」8.4.2 注意事项每个国家有每个国家的消费习惯和信仰,如果打算做的产品是信仰类或者高端定制类,最好先调研一下当地的消费能力和宗教信仰情况。支付:做私域卖东西不难,难的是怎么把钱收回来。用PayPal收款的时候,要注意是我们发账单给用户,不能用户直接转账给我们这样,直接转账是有风险的,如果产品比较敏感,用户还备注买了什么产品,这个Paypal就容易凉凉。当流量进来之后,虽然大部分都是精准粉丝,但还是需要像漏斗一样不断筛选用户的。第一层就是自动回复筛选,第二层就是询盘筛选,当用户询问怎么发货与怎么支付时,这个用户下单的几率就很高了。我们就可以给用户打上标签,方便后续跟进,在第一层被筛选掉的用户,我们也可以适当给一些优惠来刺激用户的消费欲望。很多老外都喜欢贪小便宜。下载WhatsApp的时候可以下载商业版,在这个版本的商业工具中有一些很有用的功能。比如自动回复之类的。九、短视频

“先模仿,后超越”

9.1 原创视频

TikTok的视频一般分为两种,原创视频和二创视频。前者相对更难,但是成长性非常强;后者相对简单,适合入门的时候使用。

如果你选择制作原创视频,那么对于一个刚开始做视频内容的创作者来说,建议大家在起步时先尝试模仿,通过模仿来制作出第一个视频,然后再逐步开始完全的原创。

一般来讲,制作原创视频的基本步骤有:

寻找该领域的优质账号建立爆款素材库通过模仿制作出自己的视频9.1.1 刷大量头部账号学习通过刷视频了解目标用户群其实TikTok给你推荐的视频不会局限于这个产品,还会推荐此类用户有可能喜欢的视频,从中可以窥探出你的目标用户还喜欢哪些东西。比如刷视频过程中发现解压板的7-15岁小孩用户,与玩roblox游戏的用户有很大重合度。所以roblox游戏视频相关的音乐素材拿来用效果也很好。了解目标用户的品味:同类产品他们更倾向于喜欢哪些颜色,款式。通过视频内容,播放量,评论内容都可以了解到。这个很重要!!!决定你后面买的样品款式是不是用户会高呼“我想要”的款式。学习如何提升视频爆量的概率看到一个优秀的账号后,直接看他的视频列表中播放上百万的视频,分析有什么特点,跟其它播放量少的有什么区别。刷推荐页的视频,重点看分享量>10000的视频,因为分享对播放量影响权重很高。分析是音乐原因还是视频内容原因,觉得可模仿,直接收藏进素材库。看视频爆的原因是否BGM占主要原因,多翻几个看同款BGM声音的视频是否分享转发率普遍也很高,如果是,恭喜你发现了一个有爆款潜质的音乐素材,模仿前几名的视频拍起来。

通过以上几个方法,可以建立出自己的爆款素材库,拍视频时就从中抽取,以此提升视频爆量的概率。

9.1.2 打造高信任感的账号

在做号期间,评论里可能会出现留言说,不知道是不是骗子,货能不能送到等质疑的声音。所以,打造一个看起来可信赖的账号,对转化也有很大的帮助,账号越往后转化也会有所提升。

目前看至少以下的几点是有帮助内容持续,坚持日更。最好有真人声音,让人能感受到背后的人。账号风格统一,视频封面风格统一。而不是东拼西凑的感觉。视频里,评论里经常与用户互动。及时维护评论区,导流广告的评论及时删除。9.1.3 寻找对标账号

寻找对标账号的核心:我,现阶段,能做得到甚至打得过。

我:也就是我现在的定位,寻找的对标账号一定是和我定位一样,或者类似的。

现阶段:结合自己现有的资源,现在的优劣势,得出现阶段我是一个什么样的状态、级别。

能做到甚至打得过:如果我用上了我现在的所有东西,能不能赶得上,甚至超过这个对标账号,如果能,那这个就是你的对标账号,如果不能,那就不是。

9.2 二创视频

制作原创视频的创作方式,是存在一定门槛的,并且需要花费更多的投入。因此,通过二次创作的方式制作视频也是一个不错的选择,二创视频的逻辑于原创类似,但二创的重点在于视频的素材收集于积累。

9.2.1 收集视频的方法找爆款的同款视频找新发布的视频通过商品找视频找爆款的同款视频

也就是淘宝女装店常说的跟款,适用任何一种账号类型。比如之前做宠物类目的账号,在发布nueD,卖惨类的视频很容易涨粉,那就多往这个主题方向发视频。

相比其它类型账号,好物号就更好找同款了。因为视频就是展示的商品,有具象的商品名称,快手抖音直接搜索,分分钟就搜出一大批推这个商品的视频。

找新发布的视频

上面那种方法可能会出现重复使用素材的情况,所以还必须要找新视频。

抖音多关注些好物号,多刷了养号;然后系统会自动推荐近1-2天发布的视频,平时吃饭,睡前空余时间刷一刷,然后根据点赞量,评论量,选到合适的视频。因为是最新的视频,这样极大避免重复使用素材。

通过商品找视频

之前到好物号本质还是卖货,货卖的好,视频肯定不差。那么,就可以直接去看到近期哪个品卖的好,再去找对应的视频就行了。

比如像飞瓜等第三方软件就能查到这些数据。

批量下载视频

会在第十一章工具篇更新工具链接

9.3 搬运去重(矩阵)

点击可看大图

点击可看大图

我整理了一些做矩阵和短视频比较成功的案例在表格里。大家可以在公众号回复「视频案例」可以拆分研究一下已经做成功的带货号或者矩阵号,有很多可以值得学习的点。

9.4 短视频需要注意的点不使用TikTok的时候,要把后台退掉。ip尽量不变,每次进去前先打开whoer(实在没办法要换IP也只能在这个国家,不能一会儿美国,一会儿西班牙,一会儿英国。)检查网络是否有问题,测试伪装度是否在100。没网络或者伪装度低,就不要打开TikTok,确认没有问题了在打开TikTok。9.4.1 引导

⽐如⼀个做宠物的账号,⼀定再得主⻚说:please follow if you like puppy这个意思是,如果你喜欢狗的话,请关注我,其他的品类也⼀样,主⻚得引导关注每⼀个视频的最后,加⼀个桃⼼的贴纸,然后写上“follow for more”这样别⼈才能关注你。

9.5 如何选背景音乐

音乐是一个视频很重要的一部分,选择一个能和视频内容卡点切合的音乐,绝对能提升30%的爆款性。

9.5.1 不要盲目使用快手抖音的音乐

即便音乐卡点,但在抖音很火的音乐,TikTok老外可都是第一次听到啊,自然没法引起共鸣。而且用平台比较火的音乐之后,是有流量从音乐过来的,直接在TikTok上大多数人用过的音乐即可。

9.5.2 根据视频内容,找卡点的音乐。

宠物号是轻快轻缓的音乐,但是像好物视频,要展示商品特点,节奏都是比较快的。平时多刷多收藏。

还有就是,很多好物视频是带转折的节奏。前3s是唤醒痛点,后面展示商品卖点。比如前3s说,平时扫地,头发老粘在扫把上。后面就推出带有梳子的扫把,轻松搞定扫地难题。这类带转折的音乐,也是有很多的。

一般常用的音乐可能也就十几首,建立起自己的音乐库,在后续发视频的过程中,速度就会快很多。

9.5.3 根据数据,挑选近期火热的音乐

音乐也是会过时的,得紧跟平台当时比较火的音乐。这个可以从数据分析那块,看到粉丝近期喜欢的3首音乐。如果合适的话,可以直接拿来用。

9.6 如何选取文案

视频文案是在视频内容的基础上,起到解释作用的部分,甚至有些视频只有配合了文案的情况下,才能让用户看明白其表达的含义。同时,一些引导性的文案对于出单率的提升也起到了至关重要的作用。

同时,文案也是视频的点睛之笔,可以用来加强引导,控制流量等等。

9.6.1 标题引导文案just get it on my profile website「在我的个人资料网站上找就行了」link in my bio Get it on my homepage 「在我的主页上找到它」how to xxxxx(这里写结果,如减肥,变美)?try this one!in my bio become xxxxx(这里写结果,如减肥、变美)only$xx。

9.6.2 视频引导文案enter my profile click my link find the goods order in my bio (加箭头指着自己的头像)click my homepage link (加箭头指着自己的头像)

十、直播

人、货、场

10.1话术与主播

主旨:始终站在观众立场

让观众有参与感让观众感到被重视让观众感觉直播间的一切都是利于观众的10.1.1 直播话术和技巧欢迎话术

每一分钟都是开场--强调关键信息

1、欢迎显示在大屏上的进入观众

hi jennie,welcome,how are you?hi vivian,where are you from?hi eric,welcome my new friends!don‘t forget follow me so that you can find me again!welcome tony!anything you like just tell me and i show you close up。

2、规律性话术-欢迎新人 (让欢迎话术变成肌肉记忆)

welcome to my livestream,bargain today!hi new friends,60% off today,very good price!hi my dear new friends,how are you guys?oh,many new friends is coming,follow me get more freebie guys!new friends!don’t forget follow me so that you can find me again!welcome new guys!anything you like just tell me and i show you close up互动话术

互动的目的

让直播间产生更多的有效互动数据,在Tik Tok算法层面上增加停留;在观众互动的过程中,在直播间现场层面上打造更加热闹的氛围场;

影响互动数据的6大指标:评论、关注、点赞、分享、成交、刷礼物

互动技巧-评论发问式引导评论念评论&回复评论偏向性评论互动发问式引导评论where you guys from?i really wanna know it,its amazing to know you guys from all over the world and get together in my live room. so tell me please.what time in your place guys,my time here is 3pm ,tell me yourswhat else style you guys like ,tell me,l will take all comments here into consideration.念评论&回复评论清楚念用户名字+评论引发再次评论引发其它人评论偏向性评论互动

直接询问期望人群

anyone from UK?let me know pleasemore gifts from UK friends!what time in uk now?which state you from?had dinner?how you spend your weekends?回复低期望区域评论sorry,shop cart is not available for IDrry sara from philippine,3.99 is only for UK now.互动技巧-关注

手势+话术引导

follow me and ship today for you(附加价值)follow me and more gifts for you(附加价值)follow me guys ,no follow,cannot find me again!(错失焦虑)my boss asked me get 500 new friends today,could you guys help me to achieve it?please!(引发共情)互动技巧-点赞

点赞和评论和关注不一样,点赞对于用户来说,门槛是非常低的,他只要点击屏幕就可以了。

点赞到50K玩游戏\送大礼give me 50k likes then lets play a game ,earphone as the prize!寻求点赞(话术和手势)I want 100k likes,could you guys help me to get it ?pleasemore likes so that more viewers ,help me pleasemore likes so that i can keep offering the best price for you guysdon't forget tapping screen and send me likes!互动技巧-分享

分享可多得到一份小礼物

share my livestream and more gift for youshare my livestream and ship for you by tyoday!互动技巧-成交

话术+手势,引导屏幕左下方购物车下单

go to my yellow cart to check the first link.yellow cart,left corner,you can see all my products there.

用另一台上手机示范下单流程

逼单

only 10 pcs left today guys!hurry up!the best price only today!

助播配合

how many left?only 30pcs!do more today! A lot of new friends today!no,almost out of stock,only 30 left!ok,ok,hurry up my friends! go to the yellow cart,find the 1 st link! so good price and quality!互动技巧-刷礼物

不是卖货直播间重点引导方向

有用户刷礼物,充分表达感谢

thank you lily,thank you for your roses,love you love you.wow lily give me gift! so nice of you lily!thank you for the gift lily! so generous and kind of you! l love you guys so much!销售话术

卖货主播的核心是销售

不能忘记核心是销售,比如30pic,不可能30个都给她挑,这样的话其它用户一看,要挑20分钟,等的时间太久了,就不买了。所以主播一定要把握好这个节奏。

营销活动-游戏

目的:提高互动率,从而获得更多观众,获得转化机会。

要求:简单易懂的游戏规则,能够快速介绍清楚,奖品吸引人(买不到)

游戏流程:

介绍游戏规则引发互动刷屏倒计时悬念式揭秘气氛式恭喜获奖者

通过互动游戏让直播间的人变的多了的时候,这个时候就要开始转化了,比如说我们右下角购物车,四折啊,都会有赠品啊等等。

10.1.2 把握直播间节奏

场观少、互动少时

抓住单个用户不断产生互动,拉长其在直播间的停留时长。

场观高、互动多时

同时在线用户多时,评论数量多,主播容易慌乱,容易被观众节奏带偏。

10.1.3 主播所要具备的能力

主播的基础能力

口语流利敢于销售/表演

主播本质上是一个销售,所以需要具备一个销售的能力。并不是说每一个英文说得流利的人,就具备销售能力。在面试主播的时候,也不是只要会英文就可以了,还要考验他其他方面的能力。

优秀主播需要具备的关键要素

节奏感,具备掌控大局的节奏感,不易被观众带偏,10个人在线也能播出1000人的效果,没有人也不会尴尬,不被场观影响节奏。感染力,能够站在观众的角度思考问题,具有共情能力,感染观众能跟随自己的节奏。表演力,充满想象力,不畏惧表演性的情绪表达。学习能力,具有不断学习的能力,能够不断更新学习技巧和基础知识,学习能力强。10.2常见直播案例10.2.1 不露脸直播间案例1 账号:miniature_j_world类目:玩具商品:minitoy、玩偶形式:混装礼包亮点:盲盒属性、可定制化、款式多样、上新速度快、场景饱满、色调温馨把客户的信息直接展示在直播间,这样会有一种跟顾客非常强的互动,顾客会觉得所见即所得,甚至主播还可以和观众互动,让用户去选他这个订单里面商品。案例2 账号:silentmanth类目:玩具商品:益智类玩具形式:单品展示亮点:1、吸引停留 2、互动性强场观非常高,这个东西也不难,研究半小时一小时的也可以研究明白,反正套路就那么多。但是作为主播一定要显得自己稍微笨一点,要给观众一种参与感。

<<< 左右滑动见更多 >>>

案例3 账号:crystal_nymph类目:珠宝商品:水晶石形式:混装礼包亮点:1、猎奇心理「打磨抛光」 2、周期循环 3、盲盒属性 4、解压属性循环周期,每一瞬间每一秒其实都有观众在进来直播间都会进观众。直播间的循环周期 3 分钟,5分钟必须要有个循环,这样的话让新来的观众知道他在干什么。但像这一个直播间,他的一个循环,每一秒都是一个循环,他的循环周期已经压缩到最短了。那这种时候任何一个观众任何时间进来都知道你在干什么。

案例4 账号:ohjellies类目:文具商品:漂浮笔形式:单品销售亮点:1、定制互动 2、猎奇属性 3、色调温馨首先有一个定制化的这个场景在里面。第二个是漂浮笔其实是有一定的猎奇的属性在里面,观众会想这个东西为什么能漂浮起来。这个是猎奇的属性。第三点这个整体的色调也是比较温馨的,不管从打光还是从这个场景布置上来讲都是比较契合的。

案例5 账号:cc.creamcase类目:玩具商品:定制化手机壳形式:单品销售亮点:1、产品新颖 2、独一无二 3、IP属性 4、场景饱满 5、色调温馨这个直播间整体展示形式完全是点菜单的形式,观众想要看什么就直接在这个评论区说。然后主播就拿起来展示。

10.2.2 真人出境直播间案例1 账号:wigyouwant类目:服装配饰商品:假发形式:单品销售亮点:1、产品优质 2、话术、节奏紧凑 3、主播镜头感好、展现力强 4、商品价位合适 5、排品拉升定位他们为了规避站外引流违规风险。就直接打印了一张非常大的纸出来。告诉大家这里有两个箭头。排品策略小黄车点开之后,观众第一眼看到四个链接。第一个链接一般是主推款,这个链接一般价格不要太贵,第二个第三个甚至第四个都可以成为你这个抬高拉伸你的品牌定位的这种产品,直接把它的这个价格抬高一点,让观众觉得这一家卖的东西其实不便宜,但是有这么几个福利款。*价格锚定

<<< 左右滑动见更多 >>>

案例2 账号:ludyluck258类目:家居日用商品:建盏形式:组合销售亮点:1、场景、商品、主播着装契合 2、盲盒属性 3、主播于模特分离主播扔乒乓球,乒乓球掉到哪个杯子里面,就算是观众的商品,这个其实也是具有盲盒属性的。观众也不知道自己会获得什么,会有一个这个期待感。然后这个场景搭建,会发现整个场景包括它的背景和这个建盏是非常契合的。人货场三位一体,人货场达到了合一。每一次扔完乒乓球之后,旁边都会有一个人把这个茶杯捡起来。然后这个茶杯并不是直接装给观众了装到袋子里,主播还会对每一个茶杯进行一个介绍和讲解。这个茶杯有什么样的故事?等等。

<<< 左右滑动见更多 >>>

官方飞书每个类目都会有运营经理整理很多的案例和资料,一定要记得看。比外面割韭菜的要有用的多。

十一、网站与工具11.1 常用的网站11.1.1 导航页AMZ123-跨境电商出海门户TK后勤部11.1.2 第三方数据平台Tabcut特看滴答狗TichooFastdata11.1.3 虚拟交易yxcs888(邮箱批发)特懒铺(购买美区ID)11.1.4 其它检测伪装度的网址1 www.ipip检测伪装度的网址2 whoer11.2 实用的工具11.2.1 指纹浏览器

指纹浏览器也可以称为防关联浏览器,反指纹浏览器,其目的就是为了防止浏览器收集那些用户信息,通过纯净的IP、Cookies隔离、浏览器指纹混淆或伪装等技术。防的就是用户的Cookies、IP地址、客户端(浏览器)指纹,来防止网站识别我们的身份信息。

就像我们人手上的指纹一样,指纹具有个体辨识度,可以快速的帮我们识别出个体,而浏览器指纹也是同样的道理,获取浏览器具有辨识度的信息。

对于跨境独立站商家来说,浏览器指纹就是一件非常需要注意的一件事,因为跨境电商用户在运营店铺时往往会用到多账户,或者登陆多个PayPal支付账号,而平台检测到多个账号曾在同一计算机上登录过,那就会判定这些账号为关联,封禁也是必然的了。

紫鸟浏览器Hubstudio指纹浏览器Gologin指纹浏览器猫头鹰浏览器11.2.2 视频下载哼哼猫下载器(去水印下载多平台)Downie 4(Mac电脑才有)11.2.3 其它

因为网站和工具比较多,后续可能还有其它补充的,可以私聊我,或者在公众号回复:TK工具,我已经汇总成在线表格了。

后续

即便已经差不多有两万字了,但依然还有很多没有说的。也是需要大家自己走过一遍才会知道。而且TK的规则和政策也一直在变动着。在具体执行的过程中也会遇到很多上面没有说到的情况也会看到新的机会出现。

比如之前美妆赛道很火的一个铲播模式,几乎做美妆的很多人都在做,但是官方突然出来的规则,需要报白才可以在英区做铲播,现在全部都会被系统判定为DB从而直播违规,报白也没用。

所以官方的规则是一直在变动的,但是底层的逻辑是不变的,都是为了流量和促成转化。

结尾

借薛辉常用的结尾作为这篇文章的Ending

「愿无知者有力,愿有力者前行」

DolphinDB ODBC 插件使用指南

1. ODBC 插件使用场景

在使用 DolphinDB 的业务场景中,我们有从其他数据源和 DolphinDB 之间同步数据的需求。比如从 Oracle 读数据写入到 DolphinDB,或者从 DolphinDB 写数据到 Oracle 数据库。 按照频率的不同,数据同步可以分为实时和离线同步两种。本文介绍如何使用 ODBC 插件解决离线同步的需求。

用户可以使用 DolphinDB ODBC 插件连接其它数据库服务,将其他数据库中的数据导入到 DolphinDB 数据库,或将 DolphinDB 内存表导出到其它数据库,也可以从 DolphinDB 分布式表中取出数据获得内存表,然后将该内存表导出到其他数据库中。在 DolphinDB 中使用 ODBC 插件查询和写入外部数据库的交互关系如下图所示:

2. ODBC 插件使用步骤使用 loadPlugin 函数加载 ODBC 插件。使用 odbc::connect 连接目标数据库。从其他数据库导入数据到 DolphinDB,可以使用 odbc::query 方法。从 DolphinDB 导入到其他数据库,可以使用 odbc::append 方法。3. ODBC 插件接口介绍

有关 ODBC 插件使用的前置条件、编译方法、加载方式、类型支持等,参考 ODBC 插件接口文档 。下面将介绍 ODBC 插件函数的基本功能以及一些注意事项。

3.1 odbc::connect(connStr, [dataBaseType])

创建与数据库服务器的连接,返回数据库连接句柄,该句柄将在以后用于访问数据库服务器。

参数 connStr 为 ODBC 连接字符串,针对不同数据库的 ODBC 连接,所填的配置参数会不一样,可以参考 ODBC 连接字符串配置。

同时,建议配置上 dataBaseType 参数,目前支持 MYSQL, ORACLE, SQLSERVRER, SQLITE, CLICKHOUSE, POSTGRESQL。因为使用 ODBC::append 是通过拼接 SQL 的 INSERT 语句来写入目标数据库,ODBC 插件可以通过 dataBaseType 这个参数来选择合适的时间类型格式字符串,不同数据库的时间类型的所支持的时间类型的格式是不一样的,没有配置这个参数可能会导致写入目标数据库失败。

3.2 odbc::query(connHandle|connStr, querySql, [t], [batchSize], [transform])

查询数据库并返回 DolphinDB 表。

如果需要写入到分布式表中,可以配置 batchSize 参数的大小来控制每次写入行数,可以通过配置 transform 函数来对查询过来的数据预处理,然后再写入到分布式表中。

3.3 odbc::append(connHandle, tableData, tablename,[createTableIfNotExist], [insertIgnore])

将 DolphinDB 的内存表的数据写入到目标数据库。

3.4 odbc::execute(connHandle or connStr, SQLstatements)

执行 SQL 语句。无返回结果。

4. odbc插件导入导出 Oracle 数据示例

下面将展示在 Linux 上部署 ODBC 插件,实现从 Oracle 导入数据到 DolphinDB ,并从 DolphinDB 导出数据到 Oracle 的完整过程。

4.1 下载 Oracle 的 ODBC 驱动并安装

wget https://download.oracle/otn_software/linux/instantclient/217000/instantclient-basic-linux.x64-21.7.0.0.0dbru.zipwget https://download.oracle/otn_software/linux/instantclient/217000/instantclient-odbc-linux.x64-21.7.0.0.0dbru.zip//安装解压mkdir /usr/local/oracle //存储oracle-client and oracle-odbcmkdir /etc/oracle //存储tnsnames.oraunzip instantclient-basic-linux.x64-21.7.0.0.0dbru.zip -d /usr/local/oracle/unzip instantclient-odbc-linux.x64-21.7.0.0.0dbru.zip -d /usr/local/oracle/复制代码4.2 配置 ODBC 驱动文件

odbcinsti 文件用于设置 ODBC 的某个 Driver 要用到的 ODBC 驱动库的文件路径。 需要在 /etc/odbcinsti 增加 :

[ORAC21c]Description = Oracle ODBC driver for Oracle 21cDriver = /usr/local/oracle/instantclient_21_7/libsqora.21.1复制代码

/etc/odbci 文件用于设置 ODBC 的某个 Dsn 所用到的 Driver 、账号信息、远程数据库地址以及所要使用的数据库等配置,更多配置项可参考 ODBC 连接字符串配置。其中的 Driver 配置项是在 /etc/odbcinsti 文件中配置的。

在 /etc/odbci 添加:

[orac]Description = odbc for oracleDriver = ORAC21cUserID = systemPassword = oracleServerName = ORACDatabase = test复制代码

Oracle 的 ODBC 驱动需要额外在 /etc/oracle/tnsnames.ora 文件中添加 Oracle 数据库的 IP、PORT 以及 SID 信息。其中 ORAC 配置项名是在 /etc/odbci 的_ServerName_ 的值。 在 etc/oracle/tnsnames.ora 添加:

ORAC=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = <oracle ip>)(PORT = 1521)) ) (CONNECT_DATA = (SID=ora21c) )) 复制代码4.3 添加 DolphinDB 启动时的环境变量,并重启 DolphinDB 服务

如果是单节点模式,可以在 startSingle.sh 文件中添加如下环境变量,如果是集群模式,需要在 startAgent.sh 文件中添加。

export LD_LIBRARY_PATH=/usr/local/oracle/instantclient_21_7:$LD_LIBRARY_PATHexport TNS_ADMIN=/etc/oracle// DolphinDB 默认字符编码是 utf8 编码。// Oracle 的 ODBC 驱动需要 NLS_LANG 环境来识别客户端编码,需要设置环境变量 NLS_LANG 为 utf8 编码。export NLS_LANG='AMERICAN_AMERICA.AL32UTF8'复制代码

注意:如果是集群模式,则需要启动运行代理节点的终端上先配置好环境变量,然后再启动节点。原因是 DolphinDB 数据节点的父进程是代理节点,会继承其的环境变量。对于使用自定义脚本运行的的 DolphinDB 服务,需要在对应的启动脚本里添加。

重启 DolphinDB 服务,可以执行 stopAllNode.sh 先关闭当前系统上的 DolphinDB 所有节点。然后执行 startAgent.sh 启动代理节点,然后在 DolphinDB 的集群管理网页启动数据节点。如果当前机器还配置了控制节点,需要再执行 startController.sh 启动控制节点。

4.4 使用 ODBC 插件把表数据写到 Oracle、并查询返回到 DolphinDB 中。

执行 DolphinDB 脚本加载插件

login("admin", "123456");loadPlugin("plugins/odbc/PluginODBC.txt");复制代码

选择刚刚配置好的 Oracle ODBC 驱动,使用 odbc::connect 连接 Oracle 数据库

conn=odbc::connect("Dsn=orac", `oracle);odbc::execute(conn, "create database test");//创建测试数据库复制代码

准备写入数据,创建 DolphinDB 内存表,将数据写入到 Oracle 中

colNames="col"+string(1..13)colTypes=[BOOL,CHAR,SHORT,INT,LONG,DATE,DATETIME,TIMESTAMP,NANOTIMESTAMP,FLOAT,DOUBLE,SYMBOL,STRING]t=table(1:0,colNames,colTypes)insert into t values(true,'a',2h,2,22l,2012.12.06,2012.06.12 12:30:00,2012.06.12 12:30:00.008,2012.06.13 13:30:10.008007006,2.1f,2.1,"hello","world")insert into t values(bool(),char(),short(),int(),long(),date(),datetime(),timestamp(),nanotimestamp(),float(),double(),string(),string())odbc::append(conn,t,"ddbData",true)复制代码

注意:Oracle 不支持 time 类型,目前不支持 DolphinDB 的 TIME,MINUTE,SECOND,NANOTIME 类型写入到 Oracle。

从 Oracle 查询刚刚写入的数据

ret = odbc::query(conn,"select * from ddb_alldatatypes;")复制代码5. ODBC 插件使用注意事项和常见问题

Linux 版本的 ODBC 插件是基于 unixODBC 开发的,可以使用 unixODBC 提供的基本工具 isql 来快速排查 ODBC 驱动问题。需要注意的是进行 isql 命令调试时,需要保证当前的 Linux 用户、运行的服务器和系统、环境变量和运行 DolphinDB 服务时是一致的。

在使用 ODBC 插件进行数据查询和写入遇到问题时,可以先确认当前是执行 odbc::connect 时报错还是在执行 odbc::append 时报错,来确认排查方法。

注意:1.30.20.7和2.00.8.11版本的 ODBC 插件全面支持了 MySQL,SQL Server,Oracle,ClickHouse,SQLite,PostsreSQL 数据库,修复了无法加载Oracle DSN的问题(见 5.1.1)和 某些数据类型的读写错误等问题。建议使用这2个版本之后的 ODBC 插件。

5.1 odbc::connect 失败时,可以先用 isql 命令先连接目标数据库进行排查

unixODBC 安装方法:

//CentOS 系统yum install unixODBC yum install unixODBC-devel.x86_64 //ubuntu 系统apt-get install unixodbc apt-get install unixodbc-dev复制代码

用 isql 命令进行连接时失败,常见原因是加载 odbc 驱动失败、目标数据库连接失败。

isql -v odbc_dsn //odbc_dsn 替换为设定的dsn名字isql -v MySQLDSNisql -v -k "connect_str" //connect_str 换成连接字符串isql -v -k "Driver=MySQL ODBC 8.0 Unicode Driver;Server=192.168.1.38;Port=3306;Uid=root;Pwd=123456;Database=Test"复制代码

如果 isql 命令无法连接目标数据库,可能原因如下:

5.1.1 配置文件没有添加配置信息、连接字符串写错

常见报错是 Data source name not found, and no default driver specified。

1、需要在 /etc/odbci 和 /etc/odbcinsti 中添加配置信息。

Driver 参数需要在 /etc/odbcinsti 中配置。下面的 Driver 配置项为 MySQL ODBC 8.0 Unicode Driver 。

[MySQL ODBC 8.0 Unicode Driver] Driver=/usr/lib64/libmyodbc8wUsageCount=1复制代码

Dsn 参数组需要在 /etc/odbci 中配置。下面的 Dsn 配置项组为 MySQLDSN ,该配置项组的 Driver 参数一定要在 odbcinsti 文件中找到。

[MySQLDSN] Driver=MySQL ODBC 8.0 Unicode DriverSERVER=192.168.1.38Uid=rootPWD=123456DATABASE=TestPORT=3306复制代码

2、连接字符串与 /etc/odbci 和 /etc/odbcinsti 配置信息不一致。

如果使用 Driver 的连接字符串形式isql -v -k "Driver=MySQL ODBC 8.0 Unicode Driver;Server=192.168.1.38;Port=3306;Uid=root;Pwd=123456;Database=Test"

如上需要检查 MySQL ODBC 8.0 Unicode Driver 配置项必须在 /etc/odbcinsti 文件中存在。

如果使用 Dsn 的连接字符串形式isql -v MySQLDSN

此时需要检查 MySQLDSN 配置项组必须要在 /etc/odbci 中存在,并且其 Driver 参数必须要在 /etc/odbci 文件中存在。

3、连接字符串不符合规范,可以参考 ODBC 连接字符串配置 进行配置。

5.1.2 unixODBC 配置文件路径错误

如果 odbcinsti 和 odbci 文件都已经配置好,还出现 Data source name not found, and no default driver specified 报错,基本是因为配置文件设置错误。

使用 odbcinst -j 命令查看,可以确定配置文件路径,如果是手动编译安装会出现上述问题。 但大部分情况下,配置文件都是 /etc/odbci 和 /etc/odbcinsti,所以如果出现配置文件位置的问题,可以先备份下需要覆盖的文件,然后把所有地方的这2个配置文件统一成一份。

如果设置了上图 SYSTEM DATA SOURCES 路径下的配置文件没有生效,考虑修改 USER DATA SOURCES 路径下的配置文件。

5.1.3 IP、PORT 等参数不对

1、数据库的目标端口无法访问。通常原因是目标数据库的端口不是所填端口、端口被目标数据库所在服务器的防火墙拦截、目标数据库的访问 IP 白名单没有包含客户端机器的 IP。

isql -v -k "Driver=MySQL ODBC 8.0 Unicode Driver;Server=192.168.1.38;Port=3305;Uid=root;Pwd=123456;Database=Test"[S1000][unixODBC][MySQL][ODBC 8.0(w) Driver]Can't connect to MySQL server on '192.168.1.38' (111)[ISQL]ERROR: Could not SQLDriverConnect复制代码

2、如果 isql 命令会卡顿很久最后也没连接上,大概率是网络配置问题或者是 DNS 配置错误导致所连接的 IP 是无法访问的。

isql -v -k "Driver=MySQL ODBC 8.0 Unicode Driver;Server=192.168.2.38;Port=3306;Uid=root;Pwd=123456;Database=Test"[S1000][unixODBC][MySQL][ODBC 8.0(w) Driver]Can't connect to MySQL server on '192.168.2.38' (110)[ISQL]ERROR: Could not SQLDriverConnect复制代码

注意:错误的端口号可能会造成以下问题:

ODBC 驱动程序崩溃运行 isql 命令的进程崩溃使用 ODBC 驱动时 DolphinDB 进程崩溃

目前已知 ClickHouse 和 FreeTDS 的 ODBC 驱动库在端口填错时会导致进程崩溃。

isql -v -k "Driver=FreeTDS;Servername=MSSQL;UID=SA;Pwd=Sa123456;"Segmentation fault (core dumped)复制代码5.1.4 driver 依赖出现问题

1、file not found错误

isql -v -k "Driver=MySQL ODBC 8.0 Unicode Driver;Server=192.168.1.38;Port=3306;Uid=root;Pwd=123456;Database=Test"[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc8w' : file not found[ISQL]ERROR: Could not SQLDriverConnect复制代码

可以查看是否有该驱动文件和是否有该驱动文件的读权限。

2、 isql: error while loading shared libraries: libltdl.7: cannot open shared object file: No such file or directory 错误。

到对应 ODBC Driver 路径下,使用命令查看依赖库的缺少情况

ldd libodbcdriver #libodbcdriver 替换为对应 ODBC Driver 库文件名复制代码

如果 ldd 命令中显示某个库 not found。

如果该库是已经存在的,可以通过添加 LD_LIBRARY_PATH 环境变量的值,使得能在执行 ldd 时和运行时加载依赖的动态库时找到该库。export LD_LIBRARY_PATH=LIBPATH:{LIB_PATH}:%LD_LIBRARY_PATH //LIBPATH:{LIB_PATH}修改为依赖库所在的文件夹路径该库不存在时,缺少哪个库就安装哪个库libicuuc.50 => not found yum search icu #CentOS 搜索 icu 库 apt-cache search # libicu 搜索 icu 库 yum install libicu-develxxxxxxxxxx libicuuc.50 => not found yum search icu #CentOS 搜索 icu 库apt-cache search # libicu 搜索 icu 库 yum install libicu-devel1libicuuc.50 => not found 2yum search icu #CentOS 搜索 icu 库 3apt-cache search # libicu 搜索 icu 库 4yum install libicu-devel5.2 isql 命令连接正常,使用 odbc::connect 失败5.2.1 odbc::connect 导致 DolphinDB 意外崩溃

如果运行 odbc::connect 时 DolphinDB 进程崩溃了,可以通过查看 core 文件的程序栈来判断出现的问题原因。

目前已知 odbc::connect 会导致 DolphinDB 进程崩溃的原因是所用的 ODBC 驱动的 OpenSSL 的版本与 DolphinDB 所用的不一致。

在 DolphinDB 环境中使用 ODBC 插件对 ODBC 和 OpenSSL 有版本要求,具体原因如下:

CentOS 系统内置 OpenSSL 库,OpenSSL 的版本是随操作系统编译内置的,不同的操作系统版本携带的 OpenSSL 版本不同,并且数据库的 ODBC 驱动为了适配所运行的操作系统,会使用和操作系统版本一致的 OpenSSL 。其中 CentOS 7 的 OpenSSL 版本是1.0.2,CentOS 8 是1.1.0的。而 DolphinDB 用的是1.0.2版本的 OpenSSL,OpenSSL 版本不兼容。如下为 DolphinDB 使用的1.0.2版本的 OpenSSL :

cd path_to_DolphinDB/server/strings libDolphinDB | grep -i "openssl 1."SSLv3 part of OpenSSL 1.0.2u 20 Dec 2019TLSv1 part of OpenSSL 1.0.2u 20 Dec 2019DTLSv1 part of OpenSSL 1.0.2u 20 Dec 2019复制代码

当 ODBC 驱动和 DolphinDB 发生了 OpenSSL 的版本冲突,常见的现象是 DolphinDB 进程会崩溃。解决办法是更换使用 OpenSSL 1.0.2 的 ODBC 驱动。

1、 CentOS 8 系统上使用 SQL Server 的官方 ODBC 驱动

Thread 71 "dolphindb" received signal SIGSEGV, Segmentation fault.[Switching to Thread 0x7fffd17d4700 (LWP 988437)]__strcmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:101101 ../sysdeps/x86_64/multiarch/strcmp-avx2.S: 没有那个文件或目录.(gdb) bt#0 __strcmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:101#1 0x00007ffff64705f5 in lh_insert () from ./libDolphinDB#2 0x00007ffff63c292f in OBJ_NAME_add () from ./libDolphinDB#3 0x00007fffc0e7d3b2 in ?? () from /lib/x86_64-linux-gnu/libssl.1.1#4 0x00007ffff47cc47f in __pthread_once_slow (once_control=0x7fffc0ed9928, init_routine=0x7fffc0e7d2c0) at pthread_once.c:116#5 0x00007fffc0d53aad in CRYPTO_THREAD_run_once () from /lib/x86_64-linux-gnu/libcrypto.1.1#6 0x00007fffc0e7d59b in OPENSSL_init_ssl () from /lib/x86_64-linux-gnu/libssl.1.1#7 0x00007fffc1228ff0 in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#8 0x00007fffc12233e2 in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#9 0x00007fffc1223cac in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#10 0x00007fffc11edd9f in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#11 0x00007fffc11eb93b in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#12 0x00007fffc11ec4a4 in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#13 0x00007fffc115b2e9 in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#14 0x00007fffc118f96e in ?? () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#15 0x00007fffc115a70a in SQLDriverConnectW () from /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.2.1#16 0x00007fffc154ec8a in SQLDriverConnectW () from plugins/odbc/libPluginODBC#17 0x00007fffc15171d8 in nanodbc::connection::connection_impl::connect (this=0x37d14a0, connection_string=u"Driver={ODBC Driver 17 for SQL Server};Server=192.168.1.38,1234;Database=Test;UID=SA;PWD=Sa123456", timeout=0, event_handle=0x0) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/nanodbc.cpp:1041#18 0x00007fffc1503a30 in nanodbc::connection::connection_impl::connection_impl (timeout=0, connection_string=u"Driver={ODBC Driver 17 for SQL Server};Server=192.168.1.38,1234;Database=Test;UID=SA;PWD=Sa123456", this=0x37d14a0) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/nanodbc.cpp:868#19 nanodbc::connection::connection (this=0x7fffd17cd590, connection_string=u"Driver={ODBC Driver 17 for SQL Server};Server=192.168.1.38,1234;Database=Test;UID=SA;PWD=Sa123456", timeout=0) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/nanodbc.cpp:3578#20 0x00007fffc14f43df in odbcGetConnection (heap=heap@entry=0x2b3aeb0, args=std::vector of length 1, capacity 1 = {...}, funcName="odbc::connect") at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/DolphinDBODBC.cpp:175#21 0x00007fffc14f8266 in odbcConnect (heap=0x2b3aeb0, args=std::vector of length 1, capacity 1 = {...}) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/DolphinDBODBC.cpp:336#22 0x00007ffff4f636db in SystemFunction::call(Heap*, std::vector<SmartPointer<Object>, std::allocator<SmartPointer<Object> > >&) () from ./libDolphinDB--Type <RET> for more, q to quit, c to continue without paging--#23 0x00007ffff4f64fec in RegularFunctionCall::getReference(Heap*) () from ./libDolphinDB#24 0x00007ffff4f670aa in Function::getValue(Heap*) () from ./libDolphinDB#25 0x0000000000bbea8e in AssignStatement::execute(Heap*, StatementContext&) ()#26 0x00000000007f256f in SessionImp::run(std::vector<std::string, std::allocator<std::string> > const&, std::string const&, int) ()#27 0x0000000000805819 in StdConsole::run() ()#28 0x00007ffff623e52c in Runnable::start() () from ./libDolphinDB#29 0x00007ffff623e5c0 in Thread::startFunc(void*) () from ./libDolphinDB#30 0x00007ffff47c3609 in start_thread (arg=<optimized out>) at pthread_create.c:477#31 0x00007ffff438b293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95复制代码

以上是使用了 SQL Server 的官方驱动,但是使用了 libssl.1.1 和 libcrypto.1.1 这2个1.1版本的 OpenSSL 动态库,在 odbc::connect 的时候 DolphinDB 进程崩溃了,原因是 DolphinDB 使用的是1.0.2的 OpenSSL, OpenSSL 版本不一致导致了运行错误。建议使用 freeTDS 连接 SQL Server 。

2、在 alpine 3.15 系统上使用 apk add freetds 安装的 freeTDS 连接 SQL Server

查看该 ODBC 驱动的动态库的依赖库,会发现其连接了1.1.0版本的 OpenSSL 。

0x00007ffff47d9434 in pthread_mutex_lock () from /usr/glibc-compat/lib/libpthread.0(gdb) bt#0 0x00007ffff47d9434 in pthread_mutex_lock () from /usr/glibc-compat/lib/libpthread.0#1 0x00007fffc12f57d3 in ?? () from /usr/lib/libtdsodbc.0.0.0#2 0x00007fffc12f595e in ?? () from /usr/lib/libtdsodbc.0.0.0#3 0x00007fffc12f5a02 in ?? () from /usr/lib/libtdsodbc.0.0.0#4 0x00007fffc12e47f1 in ?? () from /usr/lib/libtdsodbc.0.0.0#5 0x00007fffc12e4da7 in ?? () from /usr/lib/libtdsodbc.0.0.0#6 0x00007fffc12e8fe6 in SQLDriverConnectW () from /usr/lib/libtdsodbc.0.0.0#7 0x00007fffc13cbc8a in SQLDriverConnectW () from plugins/odbc/libPluginODBC#8 0x00007fffc13941d8 in nanodbc::connection::connection_impl::connect (this=0x2ab8ea0, connection_string=..., timeout=0, event_handle=0x0) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/nanodbc.cpp:1041#9 0x00007fffc1380a30 in nanodbc::connection::connection_impl::connection_impl (timeout=0, connection_string=..., this=0x2ab8ea0) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/nanodbc.cpp:868#10 nanodbc::connection::connection (this=0x7fffd164a4f0, connection_string=..., timeout=0) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/nanodbc.cpp:3578#11 0x00007fffc13713df in odbcGetConnection (heap=heap@entry=0x2b28dc0, args=..., funcName=...) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/DolphinDBODBC.cpp:175#12 0x00007fffc1375266 in odbcConnect (heap=0x2b28dc0, args=...) at /jenkins/jenkins/workspace/DolphinDBODBC/odbc/src/DolphinDBODBC.cpp:336#13 0x00007ffff4f606db in SystemFunction::call(Heap*, std::vector<SmartPointer<Object>, std::allocator<SmartPointer<Object> > >&) () from ./libDolphinDB#14 0x00007ffff4f61fec in RegularFunctionCall::getReference(Heap*) () from ./libDolphinDB#15 0x00007ffff4f640aa in Function::getValue(Heap*) () from ./libDolphinDB#16 0x0000000000bbea8e in AssignStatement::execute(Heap*, StatementContext&) ()#17 0x00000000007f256f in SessionImp::run(std::vector<std::string, std::allocator<std::string> > const&, std::string const&, int) ()#18 0x0000000000805819 in StdConsole::run() ()#19 0x00007ffff623b52c in Runnable::start() () from ./libDolphinDB#20 0x00007ffff623b5c0 in Thread::startFunc(void*) () from ./libDolphinDB#21 0x00007ffff47d72d6 in ?? () from /usr/glibc-compat/lib/libpthread.0#22 0x00007ffff427e113 in clone () from /usr/glibc-compat/lib/libc.6复制代码

以上是在 alpine 3.15 系统上使用 apk add FreeTDS 安装的 FreeTDS 库,但是因为其依赖了系统上的版本为1.1.0的 OpenSSL,会在连接的时候导致 DolphinDB 进程崩溃。可以使用最新的 ODBC 插件文件夹里的不依赖 OpenSSL 库的 FreeTDS 库。

5.2.2 没有设置合适的环境变量

需要保证运行 DolphinDB 和 isql 执行的环境变量是一致的,可以通过在同一终端下执行 isql 和单节点的 DolphinDB 来进行验证。环境变量 LD_LIBRARY_PATH 用于指定运行时寻找动态依赖库的路径,同时所用到的 ODBC 驱动也可能会用到特殊的环境变量,如 Oracle 的 ODBC 驱动需要用到 TNS_ADMIN 环境变量。

5.2.3 使用 LD_DEBUG 检查环境

如果配置了环境变量,isql 命令还是可以进行数据库连接,odbc::connect 还是无法执行成功,可以设置 LD_DEBUG 环境变量来检查运行时加载的依赖库,排查依赖库符号冲突、缺少问题。

配置 LD_DEBUG,启动单节点的 DolphinDB 服务。

LD_DEBUG=libs ./dolphindb 复制代码

然后执行 odbc::connect 进行数据库连接,在终端上会输出加载动态库时发生的报错信息。常见的问题是 GLIBCXX not found、CXXABI not found。

注意:目前已发现 alpine 系统的 isql 命令,指定了 LD_DEBUG=libs 也不会输出加载的动态库的信息。

LD_DEBUG=libs /usr/bin/isql复制代码

5.2.3.1 CXXABI 和 GLIBCXX 依赖问题

CXXABI 是 C++语言内部实现的一套标准,执行程序和动态库在编译时会指定它们所需要运行的 CXXABI 的版本支持,而对 C++ 这些 CXXABI 版本的功能的支持,是在 libstdc++ 中提供的。如果执行的程序或者依赖的动态库在 libstdc++ 没有找到对应版本的 CXXABI 版本,会发生异常。

DolphinDB 的可执行程序 dolphindb,其中指定了 rpath 参数为.,并且单节点的 DolphinDB 的启动工作目录是在 dolphindb 程序所在路径、集群版本的 DolphinDB 的启动脚本指定了 LD_LIBRARY_PATH 为 dolphindb 程序所在路径,所以会优先加载和 dolphindb 程序同一个文件路径的文件,而在程序 dolphindb 路径上具有 libstdc++.6 文件,会优先使用自带的这个 libstdc++ 库,所运行的 c++ 编译的库需要用 g++4.8.5 编译。如果出现 GLIBCXX not found 或者 CXXABI not found 时,需要重新编译依赖库或者下载合适版本的库。

readelf -d dolphindbDynamic section at offset 0x16237a8 contains 34 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libgfortran.3] 0x0000000000000001 (NEEDED) Shared library: [libDolphinDB] 0x0000000000000001 (NEEDED) Shared library: [libpthread.0] 0x0000000000000001 (NEEDED) Shared library: [libdl.2] 0x0000000000000001 (NEEDED) Shared library: [librt.1] 0x0000000000000001 (NEEDED) Shared library: [libstdc++.6] 0x0000000000000001 (NEEDED) Shared library: [libm.6] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.1] 0x0000000000000001 (NEEDED) Shared library: [libc.6] 0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.2] 0x000000000000000f (RPATH) Library rpath: [.]复制代码

DolphinDB 自带的 libstdc++ 库支持的 CXXABI 版本。

strings libstdc++.6 | grep CXXGLIBCXX_3.4GLIBCXX_3.4.1GLIBCXX_3.4.2GLIBCXX_3.4.3GLIBCXX_3.4.4GLIBCXX_3.4.5GLIBCXX_3.4.6GLIBCXX_3.4.7GLIBCXX_3.4.8GLIBCXX_3.4.9GLIBCXX_3.4.10GLIBCXX_3.4.11GLIBCXX_3.4.12GLIBCXX_3.4.13GLIBCXX_3.4.14GLIBCXX_3.4.15GLIBCXX_3.4.16GLIBCXX_3.4.17GLIBCXX_3.4.18GLIBCXX_3.4.19复制代码

如上就是在 CentOS 8 系统上使用 ODBC 插件加载 MySQL官方已经编译好的 ODBC 动态库驱动报 GLIBCXX_3.4.20 not found 的错误,可以改用 CentOS 7 系统上的 MySQL ODBC 动态库来解决这个问题。

在 CentOS 8 操作系统上使用 ODBC 插件连接 MySQL

下载 CentOS 8 操作系统的 Mysql ODBC 驱动。

查看其依赖库readelf -d /usr/lib64/libmyodbc8wDynamic section at offset 0x3f7ed8 contains 36 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libodbcinst.2] 0x0000000000000001 (NEEDED) Shared library: [libpthread.0] 0x0000000000000001 (NEEDED) Shared library: [librt.1] 0x0000000000000001 (NEEDED) Shared library: [libssl.1.1] 0x0000000000000001 (NEEDED) Shared library: [libcrypto.1.1] 0x0000000000000001 (NEEDED) Shared library: [libdl.2] 0x0000000000000001 (NEEDED) Shared library: [libm.6] 0x0000000000000001 (NEEDED) Shared library: [libstdc++.6] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.1] 0x0000000000000001 (NEEDED) Shared library: [libc.6] 0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.2] 0x000000000000000e (SONAME) Library soname: [libmyodbc8w] 0x000000000000000f (RPATH) Library rpath: [$ORIGIN]复制代码

会发现其依赖了系统上自带的 OpenSSL 。版本号是1.1.1的。

strings /usr/lib64/libssl.1.1| grep -i "openssl 1."OpenSSL 1.1.1k FIPS 25 Mar 2021复制代码

并且 GLIBCXX 的版本也比较高,需要用到 GLIBCXX_3.4.20 ,而普通版本的 DolphinDB 最高支持 GLIBCXX_3.4.19版本。

strings /usr/lib64/libmyodbc8w| grep GLIBCXX_3GLIBCXX_3.4.20GLIBCXX_3.4.18GLIBCXX_3.4.11GLIBCXX_3.4复制代码

解决办法是在 CentOS 8 系统上安装 CentOS 7 的 MySQL ODBC 的 rpm 包,并且编译1.0.2版本的 OpenSSL 。如果要在 CentOS 8 系统上使用 DolphinDB 的 ODBC 插件连接 MySQL,通过 MySQL 的 ODBC 驱动,需要使用1.0.2版本的 OpenSSL 。

CentOS 7 的 Mysql ODBC 下载地址:

https://downloads.mysql/archives/get/p/10/file/mysql-connector-odbc-8.0.17-1.el7.x86_64.rpm复制代码

安装 OpenSSL 1.0.2 的步骤如下:

安装 perl1yum install perl

2. 下载 OpenSSL 1.0.2k 源码

wget https://www.openssl/source/old/1.0.2/openssl-1.0.2k.tar.gz复制代码

3. 解压编译

tar -xzf openssl-1.0.2k.tar.gzcd openssl-1.0.2k./config shared --prefix=/usrl/local/ssl102 -fPICmakemake install复制代码

4. 进入 OpenSSL 安装位置,设置软链接

cd /usrl/local/ssl102/lib/ ln -s libcrypto.1.0.0 libcrypto.10ln -s libssl.1.0.0 libssl.10复制代码

5. 添加环境变量,重启 DolphinDB 服务。

export LD_LIBRARY_PATH=/usrl/local/ssl102/lib/:%LD_LIBRARY_PATH //把前面编译的好的 OpenSSL的库路径添加到环境变量中。复制代码

5.2.3.2 glibc 依赖问题

如果出现了 glibcxxx not found 的报错,原因是运行的 ODBC 驱动或者是其依赖库对 glibc 的版本过高。通常建议是使用 glibc 版本低的系统编译好无法运行的库或者下载合适版本的库,通常不建议直接升级 glibc,因为 glibc 是系统底层库,可能会对一些系统工具造成影响。

5.3 odbc::append 时报错5.3.1 odbc::connect 没有写 dataBaseType 参数

odbc::connect(connStr, [dataBaseType]) 。连接函数可以填入_dataBaseType_,可以为 "MYSQL", "SQLServer", "PostgreSQL","Oracle", "SQLITE", "CLICKHOUSE",建议连接时指定该参数,否则写入数据时可能出现报错。

5.3.2 ODBC 驱动问题

可以先用 isql 执行查询和写入语句,看是否能够执行。

5.4 odbc::execute 或者 odbc::query 失败

通常是 SQL 语句写法出错导致的问题,可以先用 isql 命令调试,或者可以使用对应数据库的图形界面工具执行相同的 SQL 语句来排查。

注意:目前已知在 ClickHouse 的官方 ODBC 驱动上,使用 use dbname 是会不生效的。

如执行:

odbc::execute(conn,"use dbname;")复制代码5.5 ODBC 驱动与 DolphinDB 冲突

8.0.18以上的 MySql ODBC 在关闭一个 ODBC 连接时,如果这个连接是唯一的连接,会调用 EVP_cleanup() 清理 OpenSSL 的环境。

这会导致其他正在使用 OpenSSL 环境的代码发生异常,例如使用 httpClient 插件查询 https网址时。

httpClient::httpGet("https://www.baidu")=>curl returns: SSL: couldn't create a context: error: 140A90F1: lib(20):func(169):reasion(241)//会抛出无法创建SSL的context的异常,因为此时SSL的初始化都被清理了,需要重新初始化。复制代码

解决办法是使用8.0.18版本以下的 MySQL ODBC。

5.6 中文字符乱码

因为 DolphinDB 的默认编码格式是 UTF-8,所以需要加载的 ODBC 驱动也以 UTF-8 编码运行。

5.6.1 odbc::query 查询包含中文字符的 varchar 列乱码

解决办法有2个:

1、设置 ODBC 驱动查询结果的字符编码,建议使用该方法。

Oracle

如果需要在 ODBC 里查询和写入的数据中包含中文,需要设置环境变量 NLS_LANG 为 UTF-8 编码

export NLS_LANG='AMERICAN_AMERICA.AL32UTF8'复制代码SQL Server

使用 FreeTDS的 ODBC 连接 SQL Server,需要在设置 FreeTDS 的客户端编码格式为 UTF-8。

[MSSQL] host = 192.168.1.38 port = 1234 tds version = 7.2 client charset = UTF-8 复制代码

2、查询的 SQL 语句中将 varchar 类型转换 nvarchar。

select cast(t.G_NAME as nchar(10)) from SZ_PTS_DEC t复制代码5.6.2 odbc::append 的表数据包含中文时写入目标数据库失败Oracle

需要设置环境变量 NLS_LANG

SQL Server、SQLite 数据库目前不支持写入包含中文的数据

原因是目前 ODBC 插件是使用 SQLDriverConnectW 接口进行写入的。而 SQL Server 用到的 FreeTDS ODBC 驱动、SQLite的官方 ODBC 均未实现该方法,这时会将把 Unicode 字符集转成 ANSI 字符集,然后把转换后的字符串调用 SQLDriverConnect ,但是因为这2个驱动都不支持 ANSI 编码,所以会导致写入失败。

可以通过以下命令查看 ODBC 库是否支持 SQLDriverConnectW 方法。

// 查询 SQL Server 用到的 FreeTDS 的 ODBC 驱动,不包含 SQLDriverConnectW 的实现nm -D /hdd1/release/200.9/server/plugins/odbc/libtdsodbc.0.0.0 | grep SQLDriverConnectW// SQLite 的ODBC驱动,不包含 SQLDriverConnectW 的实现nm -D /usr/lib/x86_64-linux-gnu/odbc/libsqlite3odbc | grep SQLDriverConnectW// Oracle 的 ODBC 驱动,包含 SQLDriverConnectW 的实现nm -D /usr/local/oracle/instantclient_21_7/libsqora.21.1 | grep SQLDriverConnectW0000000000076730 T SQLDriverConnectW复制代码5.7 常见系统各数据库的ODBC 驱动推荐列表

声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送至邮件举报,一经查实,本站将立刻删除。转载务必注明出处:http://www.hixs.net/article/20231010/169624529736401.html