
# 连接数据库
ODBC连接数据库之前需要准备好所需资源。连接数据库是通过配置ODBC数据源，使用ODBC API或者相应的驱动程序，实现应用程序与数据库之间的通信和交互。本章节介绍如何在Linux/Windows系统下配置数据源并连接到数据库。
 #### Linux下配置数据源
1. 安装unixODBC（默认unixODBC源码包已在环境准备中获取）。如果机器上已经安装了其他版本的unixODBC，可以直接覆盖安装。 
   以unixODBC-2.3.7版本为例，在客户端执行如下命令安装unixODBC。
   ```
   tar zxvf unixODBC-2.3.7.tar.gz
   cd unixODBC-2.3.7
   ./configure --enable-gui=no #如果要在ARM服务器上编译，请追加一个configure参数： --build=aarch64-unknown-linux-gnu 
   make
   #安装可能需要root权限
   make install
   ```
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   - 目前不支持unixODBC-2.2.1版本。
   
   - unixODBC默认安装到"/usr/local"目录下，生成数据源文件到 "/usr/local/etc"目录下，库文件生成在"/usr/local/lib"目录。
   
   - 通过编译带有--enable-fastvalidate=yes选项的unixODBC来获得更高性能。但此选项可能会导致向ODBC API传递无效句柄的应用程序发生故障，而不是返回SQL_INVALID_HANDLE错误。
    
   
   
2. 替换客户端GaussDB驱动程序。 
   将GaussDB-Kernel_数据库版本号_操作系统版本号_64bit_Odbc.tar.gz解压。解压后会得到两个文件夹：lib与odbc，在odbc文件夹中还会有一个lib文件夹。将解压后得到的/lib文件夹与/odbc/lib文件夹中的所有动态库都复制到"/usr/local/lib"目录下。
   
   
3. 配置数据源。 
   1. 配置ODBC驱动文件。 在"/usr/local/etc/odbcinst.ini"文件中追加以下内容。
      ```
      [GaussMPP]
      Driver64=/usr/local/lib/gsqlodbcw.so
      setup=/usr/local/lib/gsqlodbcw.so
      ```
      odbcinst.ini文件中的配置参数说明如[表1]所示：
       表1odbcinst.ini文件配置参数 
      | **参数**         | **描述**                     | **示例**                               |
      |:---|:---|:---|
      | \[DriverName\] | 驱动器名称，对应数据源DSN中的驱动名。       | \[GaussMPP\]                         |
      | Driver64       | 驱动动态库的路径。                  | Driver64=/usr/local/lib/gsqlodbcw.so |
      | setup          | 驱动安装路径，与Driver64中动态库的路径一致。 | setup=/usr/local/lib/gsqlodbcw.so    |
         
      
   
   2. 配置数据源文件。 在"/usr/local/etc/odbc.ini"文件中追加以下内容。
      ```
      [gaussdb]
      Driver=GaussMPP
      #数据库Server IP
      Servername=127.0.0.1
      #数据库名
      Database=db1
      #数据库用户名
      Username=omm
      #数据库用户密码
      Password=
      #数据库侦听端口
      Port=8000
      Sslmode=allow
      ```
      odbc.ini文件配置参数说明如[表2]所示，更加详细的参数说明请参见[Linux系统下配置数据源](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0135.html)章节。
       表2odbc.ini文件配置参数 
      | **参数**                                                                      | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | **示例**                           |
      |:---|:---|:---|
      | \[DSN\]                                                                     | 数据源的名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | \[gaussdb\]                      |
      | Driver                                                                      | 驱动名，对应odbcinst.ini中的DriverName。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | Driver=GaussMPP                  |
      | Servername                                                                  | 服务器的IP地址。可配置多个IP地址。支持IPv4和IPv6。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | Servername=127.0.0.1             |
      | Database                                                                    | 要连接的数据库的名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | Database=db1                     |
      | Username                                                                    | 数据库用户名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | Username=omm                     |
      | Password                                                                    | 数据库用户密码。 说明： - ODBC驱动本身已经对内存密码进行过清理，以保证用户密码在连接后不会再在内存中保留。  - 但是如果配置了此参数，由于UnixODBC对数据源文件等进行缓存，可能导致密码长期保留在内存中。  - 推荐在应用程序连接时，将密码传递给相应API，而非写在数据源配置文件中。同时连接成功后，应当及时清理保存密码的内存段。  - 配置文件中填写密码时，需要遵循http规则： - 字符应当采用URL编码规范，如"!"应写作"%21"，"%"应写作"%25"，因此应当特别注意字符。  - "+"会被替换为空格" "。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | Password=\*\*\*\*\*\*\*\*        |
      | Port                                                                        | 服务器的端口号。当开启负载均衡时，可配置多个端口号，且需与配置的多IP一一对应。如果开启负载均衡配置多个IP时，仍只配置一个端口号，则默认所有IP共用同一个端口号，即为配置的端口号。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | Port=8000                        |
      | Sslmode                                                                     | 是否启用 SSL 连接。 说明： 关于Sslmode的选项的允许值，具体信息如[表3 Sslmode的可选项及其描述]所示。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | Sslmode=allow                    |
      | Debug                                                                       | 控制调试模式的开启及日志输出级别。 取值范围：0 \~ INT_MAX - 设置为0时表示不启用调试模式。  - 设置为大于0的值时将启用调试日志，会打印gsqlODBC驱动的mylog。日志生成目录为/tmp/，文件名为mylog_xxx.log。  - 设置为1时表示仅输出FATAL级别日志。  - 设置为2时表示输出FATAL和ERROR级别日志。  - 设置为3时表示输出FATAL、ERROR和WARN级别日志。  - 设置为4时表示输出FATAL、ERROR、WARN和INFO级别日志。  - 设置为≥5时表示输出所有级别日志，增加输出TRACE级别日志。   默认值为0。 说明： 1. FATAL：报告致命错误。  2. ERROR：报告异常错误。  3. WARN：报告警告信息。  4. INFO：记录程序运行中的正常关键信息。  5. TRACE：提供开发人员使用的调试信息。   | Debug=5                          |
      | CommLog                                                                     | 控制后端通信日志的开启及日志输出级别。 取值范围：0 \~ INT_MAX - 设置为0时表示不启用。  - 设置为大于0的值时将启用后端日志，会打印gsqlODBC驱动的qlog。日志生成目录为/tmp/，文件名为gsqlodbc_xxx.log。  - 设置为1时表示仅输出ERROR级别日志。  - 设置为2时表示输出ERROR和INFO级别日志。  - 设置为≥3时表示输出ERROR、INFO和TRACE级别日志。   默认值为0。 说明： 1. ERROR：报告异常错误。  2. INFO：记录程序运行中的正常关键信息。  3. TRACE：提供开发人员使用的调试信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | CommLog=1                        |
      | UseServerSidePrepare                                                        | 是否开启数据库端扩展查询协议。 取值范围：0，1 - 取值为0表示不开启。  - 取值为1表示开启。   默认值为1。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | UseServerSidePrepare=1           |
      | UseBatchProtocol                                                            | 是否开启批量查询协议（打开可提高DML性能）。 取值范围：0，1 - 取值为0时，不使用批量查询协议（主要用于与早期数据库版本通信兼容）。  - 取值为1，并且数据库support_batch_bind参数存在且为on时，将打开批量查询协议。   默认值为1。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | UseBatchProtocol=1               |
      | ForExtensionConnector                                                       | 此开关控制着savepoint是否发送，savepoint相关问题可以注意此开关。 取值范围：0，1 - 取值为0时表示发送savepoint。  - 取值为1时表示不发送savepoint。   默认值为1。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | ForExtensionConnector=1          |
      | ConnectionExtraInfo                                                         | GUC参数connection_info中显示驱动部署路径和进程属主用户的开关。 取值范围：0，1 - 取值为0时表示不打开此开关。  - 取值为1时表示打开此开关。   默认值为0。 说明： 当设置为1时，ODBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | ConnectionExtraInfo=1            |
      | BoolsAsChar                                                                 | 是否将布尔值作为字符处理。 取值范围：0，1 - 取值为0时表示Bools值将会映射为SQL_BIT。  - 取值为1时表示Bools值将会映射为SQL_CHAR。   默认值为1。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | BoolsAsChar = 1                  |
      | RowVersioning                                                               | 是否在更新一行数据时，允许应用检测数据有没有被其他用户进行修改。 取值范围：0，1 - 取值为0时表示不允许应用检测。  - 取值为1时表示允许应用检测。   默认值为0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | RowVersioning=1                  |
      | ShowSystemTables                                                            | 是否将默认系统表视为普通SQL表。 取值范围：0，1 - 取值为0时驱动不会将默认系统表视为普通SQL表。  - 取值为1时驱动将默认系统表视为普通SQL表。   默认值为0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | ShowSystemTables=1               |
      | AutoBalance                                                                 | ODBC控制负载均衡的开关。 取值范围：0，1 - 取值为0时表示不开启负载均衡。  - 取值为1时开启负载均衡。   默认值为0。 说明： 连接的数据库版本在505.2.0.SPC0200以下时，不支持容灾集群负载均衡。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | AutoBalance=1                    |
      | RefreshCNListTime                                                           | 开启负载均衡时可配置该参数，该参数为刷新CN列表的时间。整数型，单位为秒。 取值范围：0 \~ INT_MAX - 取值为0时表示不开启该参数。  - 取值大于0时表示该设定值为刷新CN列表的时间。   默认值为10                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | RefreshCNListTime=5              |
      | Priority                                                                    | 开启负载均衡时可配置该参数。 取值范围：0，1 - 取值为0时表示不开启该参数。  - 取值为1时开启该参数。   默认值为0。 说明： 当Priority开启时，应用程序发起的所有连接优先发送到配置文件中配置的CN上，当配置的CN全部不可用时，连接才会发送到剩余的CN上。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | Priority=1                       |
      | UsingEip                                                                    | 开启负载均衡时可配置该参数。 取值范围：0，1 - 取值为0时表示不开启该参数。  - 取值为1时开启该参数。   默认值为0。 说明： 此值用于控制是否使用业务IP（对应pgxc_node表中node_host1和node_port1列）做负载均衡。当UsingEip开启时，表示使用业务IP做负载均衡；关闭表示使用数据IP（对应pgxc_node表中node_host和node_port列）做负载均衡。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | UsingEip=1                       |
      | MaxCacheQueries | 控制每个连接缓存的预编译语句个数。 取值范围：0 \~ 4096 默认值为0。 说明： 如果设置为0，则不开启客户端预编译语句缓存池。设置为大于4096的值会限制为4096。如果执行过的语句个数超过MaxCacheQueries设置的上限，则淘汰最近最少使用的语句。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | MaxCacheQueries=128              |
      | MaxCacheSizeMiB                                                             | 控制每个连接缓存的预编译语句总大小，在MaxCacheQueries大于0时生效。 取值范围：0 \~ 4096 默认值为1。 说明： 如果缓存的语句总长度大于MaxCacheSizeMiB则淘汰最近最少使用的语句。单位为MB，设置为大于4096的值会限制为4096。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | MaxCacheSizeMiB=10               |
      | TcpUserTimeout                                                              | 在支持TCP_USER_TIMEOUT套接字选项的操作系统上，指定传输的数据在TCP连接被强制关闭之前可以保持未确认状态的最大时长。 取值范围：0 \~ INT_MAX 默认值为0。 说明： 0表示使用系统缺省。通过Unix域套接字做的连接忽略这个参数。单位为毫秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | TcpUserTimeout=5000              |
      | StandbyRead                                                                 | 用于指定分布式是否开启备机读模式。 取值范围：0，1 - 取值为0时表示禁用备机读模式。  - 取值为1时表示开启备机读模式。   默认值为0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | StandbyRead=1                    |
      | Pqopt                                                                       | 用于设置libpq连接参数，参数之间用空格间隔。libpq参数请参见[连接参数说明](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0319.html)章节。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | Pqopt=keepalives=0               |
      | KeepaliveTime                                                               | 在TCP应该发送一个保持激活的信息给服务器之后，控制不活动的秒数。如果是通过 Unix 域套接字进行连接，或者禁用了"保持激活"功能，则该参数将被忽略。 取值范围：0 \~ INT_MAX 设置为0值或者不配置表示使用系统缺省。 说明： 禁用"保持激活"功能需要通过Pqopt参数设置keepalives=0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | KeepaliveTime=2                  |
      | KeepaliveInterval                                                           | 在TCP保持激活信息没有被应该传播的服务器承认之后，控制探活报文发送的间隔秒数。如果是通过 Unix 域套接字进行连接，或者禁用了"保持激活"功能，则该参数将被忽略。 取值范围：0 \~ INT_MAX 设置为0值或者不配置表示使用系统缺省。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | KeepaliveInterval=2              |
      | KeepaliveCount                                                              | 控制TCP发送保持激活信息的次数。如果是通过 Unix 域套接字进行连接，或者禁用了"保持激活"功能，则该参数将被忽略。 取值范围：0 \~ INT_MAX 设置为0值或者不配置表示使用系统缺省。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | KeepaliveCount=2                 |
      | SocketTimeout                                                               | 用于控制客户端与服务端建立连接完全成功后的socket读写超时时间。单位为秒，默认为0。 说明： 该参数包括了数据库语句执行的超时时间，设置的过小可能导致语句执行时间本身发生超时，因此默认为0，需根据场景配置，建议设置非0值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | SocketTimeout=5                  |
      | SocketTimeoutInConnect                                                      | 用于控制TCP三次握手成功后，客户端与服务端建立连接阶段的socket读写超时时间。单位为秒，默认为5。 说明： 该参数区别于SocketTimeout：由于三次握手成功后的客户端与服务端建立连接阶段可能存在阻塞，因此需要设置不影响语句执行超时的socket读写超时时间。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | SocketTimeoutInConnect=5         |
      | CancelTimeout                                                               | 用于控制应用端发送cancel消息的超时时间。单位为秒，默认为0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | CancelTimeout=5                  |
      | TcpSYNRetries                                                               | 用于控制TCP三次握手阶段时SYN最多重传的次数，超过该次数仍未建连成功即报错。默认为0次。 说明： 该参数在支持TCP_SYNCNT套接字选项的操作系统上，指定客户端建立连接三次握手阶段SYN包发送失败而重传的次数。0值表示使用系统缺省。通过Unix域套接字的连接忽略这个参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | TcpSYNRetries=3                  |
      | TextAsLongVarchar                                                           | 将内核侧text类型映射为驱动侧的SQL_LONGVARCHAR类型或者SQL_VARCHAR类型。 取值范围：0，1。 取值为0时表示将内核侧text类型映射为驱动侧的SQL_VARCHAR类型。 取值为1时表示将内核侧text类型映射为驱动侧的SQL_LONGVARCHAR类型。 默认值为1。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | TextAsLongVarchar=1              |
      | MaxLongVarcharSize                                                          | 驱动侧的SQL_LONGVARCHAR类型的最大长度。 取值范围：0 \~ INT_MAX。 默认值为8190。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | MaxLongVarcharSize=8190          |
      | MaxVarcharSize                                                              | 驱动侧的SQL_VARCHAR类型的最大长度。 取值范围：0 \~ INT_MAX。 默认值为255。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | MaxVarcharSize=255               |
      | TargetServerType                                                            | 设定连接的主机的类型。主机的类型和设定的值一致时才能连接成功。设置规则如下： - primary（默认值）：仅对主备系统中的主节点进行连接。  - cluster-primary：仅对主集群CN节点能进行连接。  - cluster-mainnode：仅对容灾集群CN节点能进行连接。 说明： cluster-primary和cluster-mainnode选项只支持流式容灾。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | TargetServerType=cluster-primary |
      | EnableHostCache                                                             | 是否开启节点缓存功能，0表示不开启，1表示开启。默认开启。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | EnableHostCache=1                |
         
       表3Sslmode的可选项及其描述 
      | Sslmode     | 是否会启用SSL加密 | 描述                                                                    |
      |:---|:---|:---|
      | disable     | 否          | 不使用SSL安全连接，为默认值。                                                      |
      | allow       | 可能         | 如果数据库服务器要求使用，则可以使用SSL安全加密连接，但不验证数据库服务器的真实性。                           |
      | prefer      | 可能         | 如果数据库支持，那么首选使用SSL安全加密连接，但不验证数据库服务器的真实性。                               |
      | require     | 是          | 必须使用SSL安全连接，但是只做了数据加密，并不验证数据库服务器的真实性。                                 |
      | verify-ca   | 是          | 必须使用SSL安全连接，并且验证数据库是否具有可信证书机构签发的证书。                                   |
      | verify-full | 是          | 必须使用SSL安全连接，在verify-ca的验证范围之外，同时验证数据库所在主机的主机名是否与证书内容一致。GaussDB不支持此模式。 |
         
      ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
      用户通过ODBC连接GaussDB服务器时，可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时，默认用户已经获取了服务端和客户端所需要的证书和私钥文件，关于证书等文件的获取请参考Openssl相关文档和命令。
      
   
   
   
   
4. 在客户端配置环境变量。 
   ```
   vim ~/.bashrc
   ```
   在配置文件中追加以下内容。
   ```
   export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
   export ODBCSYSINI=/usr/local/etc
   export ODBCINI=/usr/local/etc/odbc.ini
   ```
   
   
5. 执行如下命令使设置生效。 
   ```
   source ~/.bashrc
   ```
   
   
6. 测试连接。 
   安装后/usr/bin下面会存放生成的二进制，可执行isql -v gaussdb（数据源名称）命令。
   - 如果显示如下信息，表明配置正确，连接成功。
     ```
     +---------------------------------------+
     | Connected!                            |
     |                                       |
     | sql-statement                         |
     | help [tablename]                      |
     | quit                                  |
     |                                       |
     +---------------------------------------+
     ```
     
   
   - 若显示ERROR信息，则表明配置错误。请检查上述配置步骤是否正确执行。
   
   
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   目前通过ODBC连接数据库时，会如下设置内核参数：
   ```
   SET extra_float_digits = 2;
   SET DateStyle = 'ISO';
   ```
   这些参数可能会导致ODBC客户端的行为与gsql客户端的行为不一致，例如，Date数据显示方式、浮点数精度表示等。如果实际期望和这些配置不符，建议在ODBC应用代码中显式设定这些参数。
   M-Compatibility模式数据库下，extra_float_digits的默认值为0。
   
   
 
 #### Windows下配置数据源
Windows操作系统自带ODBC数据源管理器，无需用户手动安装管理器便可直接进行配置。
1. 替换客户端GaussDB驱动程序。 
   根据需要，将包名为GaussDB-Kernel_数据库版本号_Windows_X64_Odbc.tar.gz的64位驱动或包名为GaussDB-Kernel_数据库版本号_Windows_X86_Odbc.tar.gz的32位驱动解压后，单击gsqlodbc.exe进行驱动安装。
   
   
2. 打开驱动管理器。 
   请使用ODBC版本对应的ODBC驱动管理器（如果使用64位ODBC驱动，必须要使用64位的ODBC驱动管理器，假设操作系统安装盘符为C盘，如果是其他盘符，请对路径做相应修改）。
   - 如果需要在64位操作系统使用32位ODBC驱动请使用：C:\\Windows\\**SysWOW64** \\odbcad32.exe，请勿直接使用"控制面板 \> 管理工具 \> 数据源(ODBC)"。
     ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
     WOW64的全称是"Windows 32-bit on Windows 64-bit"，C:\\Windows\\SysWOW64\\存放的是64位系统上的32位运行环境。而C:\\Windows\\System32\\存放的是与操作系统一致的运行环境，具体的技术信息请查阅Windows的相关技术文档。
     
   
   - 32位操作系统请使用：C:\\Windows\\System32\\odbcad32.exe，或者单击"计算机 \> 控制面板 \> 管理工具 \> 数据源(ODBC)"打开驱动管理器。
   
   - 64位操作系统请使用：控制面板 \> 管理工具 \> 数据源(ODBC) 打开驱动管理。
   
   
   
   
3. 配置数据源。
   
   在打开的驱动管理器上，选择"用户DSN \> 添加 \> GaussDB Unicode"，然后进行配置。如下[图1]所示：
   图1ODBC Driver Setup   
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620720455.png)
   参数说明请参见[Linux下配置数据源]文件配置参数。
   其中单击Datasource可以选择配置是否打印日志，单击后弹出对话框如下[图2]所示：
   图2Advanced Options Page1   
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620640581.png)
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
   此界面上配置的用户名及密码信息，将会被记录在Windows注册表中，再次连接数据库时不再需要输入认证信息。但是出于安全考虑，建议在单击"Save"按钮保存配置信息前，清空相关敏感信息，在使用ODBC的连接API时，再传入所需的用户名、密码信息。
   
   
4. SSL模式。 
   将[3]中设置窗口的"SSL Mode"选项调整至"require"。
   表4Sslmode的可选项及其描述 
   | Sslmode     | 是否会启用SSL加密 | 描述                                                                                |
   |:---|:---|:---|
   | disable     | 否          | 不使用SSL安全连接。                                                                       |
   | allow       | 可能         | 如果数据库服务器要求使用，则可以使用SSL安全加密连接，但不验证数据库服务器的真实性。                                       |
   | prefer      | 可能         | 如果数据库支持，那么首选使用SSL安全加密连接，但不验证数据库服务器的真实性。                                           |
   | require     | 是          | 必须使用SSL安全连接，但是只做了数据加密，并不验证数据库服务器的真实性。                                             |
   | verify-ca   | 是          | 必须使用SSL安全连接，并且验证数据库是否具有可信证书机构签发的证书。当前windows ODBC不支持cert方式认证。                     |
   | verify-full | 是          | 必须使用SSL安全连接，在verify-ca的验证范围之外，同时验证数据库所在主机的主机名是否与证书内容一致。当前windows ODBC不支持cert方式认证。 |
      
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   用户通过ODBC连接GaussDB服务器时，可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时，默认用户已经获取了服务端和客户端所需要的证书和私钥文件，关于证书等文件的获取请参考Openssl相关文档和命令。
   
   
5. 测试连接。 
   单击Test进行测试。
   - 如果显示如下，则表明配置正确，连接成功。
     图3配置成功   
     ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590360880.png) 
   
   - 若显示ERROR信息，则表明配置错误。请重新检查上述配置是否正确。
   
   
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   目前通过ODBC连接数据库时，会设置以下内核参数：
   ```
   SET extra_float_digits = 2;
   SET DateStyle = 'ISO';
   ```
   这些参数可能会导致ODBC客户端的行为与gsql客户端的行为不一致，例如，Date数据显示方式、浮点数精度表示等。如果实际期望和这些配置不符，建议在ODBC应用代码中显式设定这些参数。
   M-Compatibility模式数据库下，extra_float_digits的默认值为0。
   
   
 
#### 操作示例
以开发源程序DBtest.c为例，此示例演示如何通过ODBC获取和处理GaussDB中的数据。
前提条件：数据源已配置成功（完整示例请参见[获取和处理数据库中的数据](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0143.html)章节）。
```
// DBtest.c (compile with: libodbc.so)
// 程序头文件和全局变量请参考完整示例
// 申请环境句柄。       
V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);     
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))        
{           
   printf("Error AllocHandle\n");           
   exit(0);        
}
// 设置版本信息（环境属性）。         
SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 申请连接句柄。      
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))      
{                     
   SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
   exit(0);       
}
// 获取用户名和用户密码。
char *userName;
userName = getenv("EXAMPLE_USERNAME_ENV");
char *password;
password = getenv("EXAMPLE_PASSWORD_ENV");
// 设置连接属性。
SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT,(SQLPOINTER *)SQL_AUTOCOMMIT_ON, 0);
// 连接数据库，这里的userName与password分别表示连接数据库的用户名和用户密码。
// 如果odbc.ini文件中已经配置了用户名密码，那么这里可以留空（""）；但是不建议这么做，因为一旦odbc.ini权限管理不善，将导致数据库用户密码泄露。    
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
   (SQLCHAR*) userName, SQL_NTS,  (SQLCHAR*) password, SQL_NTS);        
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))      
{           
  printf("Error SQLConnect %d\n",V_OD_erg);            
  SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
  exit(0);        
}     
printf("Connected !\n");
```
