Skip to content

Latest commit

 

History

History
314 lines (263 loc) · 7.24 KB

16.md

File metadata and controls

314 lines (263 loc) · 7.24 KB

Linux Programing -- ch8 -- MySQL

1. 配置文件路径

/etc/mysql/my.cnf

2. 查看变量

mysqladmin variables

3. 修改密码

mysqladmin -u root password newpassword

(这种方法会泄密,shell 历史记录)

mysql>SET password=PASSWORD('yourpassword')

4. 导出数据

mysqldump -u root -p dbname > backup.dump

5.数据类型

定义 说明
CHAR 单字符
CHAR(N) 正好有 N 个字符到字符串,如果必要会议空格字符填充,限制为 255
VARCHAR(N) N 个字符到可变长数组,限制为 255 个字符
TINYTEXT 类似 VARCHAR(N)
MEDIUMTEXT 最长为 65535 个字符到文本字符串
LONGTEXT 最长为 2 的 32 次方 -1 个字符到文本字符串
TINYINT 8 位整型
SMALLINT 16 位整型
MEDIUMINT 24 位整型
INIT 64 位整型
BIGINT 64 位整型
FLOAT(P) 浮点型,精度至少为 P 位数字
DOUBLE(D,N) 浮点型,有符号双精度浮点,有 D 位数字和 N 位小数
NUMERIC(P,S) 浮点型,总长为 P 位到真实数字,小数点后有 S 位数字, 与 DOUBLE 不同,这是一个准确到数,因此适合用来储存货币值,但处理效率会低一点
DECIMAL(P,S) 浮点型,与 NUMERIC 同义

6. APIs

1. 例程

#include <stdlib.h>
#include <stdio.h>
#include <mysql/mysql.h>

int main(int argc, char *argv[])
{
    MYSQL *conn_ptr;
    conn_ptr = mysql_init(NULL);

    if(!conn_ptr){
        fprintf(stderr, "mysql_int failed\n");
        return EXIT_FAILURE;
    }
    conn_ptr = mysql_real_connect(conn_ptr, "localhost", "root", "root", "test", 0, NULL, 0);

    if(conn_ptr){
        printf("Connection success\n");
    }else{
        printf("Connection failed\n");
    }

    mysql_close(conn_ptr);
    return EXIT_SUCCESS;
}

2. 连接数据库

#include <mysql.h>

MYSQL *mysql_init(MYSQL *);

MYSQL *mysql_real_connect(MYSQL *connection,
    const char *servar_host,
    const char *sql_user_name,
    const char *sql_password,
    const char *db_name,
    unsigned int port_number,
    const char *unix_socket_name,
    unsigned int flags);
void mysql_close(MYSQL *connection);

3. 数据库连接选项

int mysql_options(MYSQL *connection, enum option_to_set, const char *argument);

连接选项只能在 mysql_init 和 mysql_real_connct 之间调用,每次只能设置一个选项

enum 选项 实际参数类型 说明
MySQL_OPT_CONNECT_TIMEOUT const unsigned int * 连接超时等待
MySQL_OPT_COMPRESS NULL 网络连接中使用压缩机制
MySQL_OPT_COMMAND const char * 每次连接建立后发送的命令

4. 错误处理

unsigned int mysql_errno(MYSQL *connection);
char *mysql_error(MYSQL *connection);

5. 执行 SQL 语句

执行查询, 其中 mysql_query 不能查询二进制字段

int mysql_query(MYSQL *mysql, const char *stmt_str);
int mysql_real_query(MYSQL *mysql, const char* stmt_str)

获取受影响数

my_ulonglong mysql_affected_rows(MYSQL *mysql);

返回受影响行数,注意:只查询有修改的行数,如果需要返回传统的匹配的行数连接时使用标记:CLIENT_FOUND_ROWS

5. 自动插入内容

当使用了AUTO_INCREMENT选项建表后,可以使用LAST_INSERT_ID()获取插入的内容

CREATE TABLE children(
    childno INTEGER AUTO_INCREMENT NOT NULLPRIMARY KEY,
    fname VARCHAR(10),
    age INTEGER
);

mysql>SELECT LAST_INSERT_ID();

获取结果,mysql_store_result 为一次获取结果,mysql_use_result 为游标方式

MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES *mysql_use_result(MYSQL *mysql);
void mysql_free_result(MYSQL *result);

游标定位 & 行数获取

void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset); // offset 为行号
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result); // 获取当前位置,注意不是行号,只能用于 mysql_store_result
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset); // 移动当前位置,返回之前位置, 只能用于 mysql_store_result
my_ulonglong mysql_num_rows(MYSQL_RESS *result); // 获取行数,只能用于 mysql_store_result

提取行 & 获取行字段数

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
unsigned int mysql_field_count(MYSQL *mysql);

提取字段信息

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL *result, MYSQL_FIELD_OFFSET offset);
MYSQL *mysql_fetch_field(MYSQL_RES *result);

MYSQL_FIELD 结构定义

typedef struct st_mysql_field {
  char *name;                 /* Name of column */
  char *org_name;             /* Original column name, if an alias */
  char *table;                /* Table of column if column was a field */
  char *org_table;            /* Org table name, if table was an alias */
  char *db;                   /* Database for table */
  char *catalog;          /* Catalog for table */
  char *def;                  /* Default value (set by mysql_list_fields) */
  unsigned long length;       /* Width of column (create length) */
  unsigned long max_length;   /* Max width for selected set */
  unsigned int name_length;
  unsigned int org_name_length;
  unsigned int table_length;
  unsigned int org_table_length;
  unsigned int db_length;
  unsigned int catalog_length;
  unsigned int def_length;
  unsigned int flags;         /* Div flags */
  unsigned int decimals;      /* Number of decimals in field */
  unsigned int charsetnr;     /* Character set */
  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
  void *extension;
} MYSQL_FIELD;

enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
    MYSQL_TYPE_SHORT,  MYSQL_TYPE_LONG,
    MYSQL_TYPE_FLOAT,  MYSQL_TYPE_DOUBLE,
    MYSQL_TYPE_NULL,   MYSQL_TYPE_TIMESTAMP,
    MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
    MYSQL_TYPE_DATE,   MYSQL_TYPE_TIME,
    MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
    MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
    MYSQL_TYPE_BIT,
    MYSQL_TYPE_TIMESTAMP2,
    MYSQL_TYPE_DATETIME2,
    MYSQL_TYPE_TIME2,
                    MYSQL_TYPE_NEWDECIMAL=246,
    MYSQL_TYPE_ENUM=247,
    MYSQL_TYPE_SET=248,
    MYSQL_TYPE_TINY_BLOB=249,
    MYSQL_TYPE_MEDIUM_BLOB=250,
    MYSQL_TYPE_LONG_BLOB=251,
    MYSQL_TYPE_BLOB=252,
    MYSQL_TYPE_VAR_STRING=253,
    MYSQL_TYPE_STRING=254,
    MYSQL_TYPE_GEOMETRY=255
};

预定义宏 IS_NUM 用于判断是否为数字型