MySql 安装使用及C++连接字符串

参考:

1. MySQL函数 - 逆心 - 博客园  http://www.cnblogs.com/kissdodog/p/4168721.html

2.MySQL - Data too long for column 'uid' at row 1 Query: - J.L.Lee - 博客园  https://www.cnblogs.com/anstoner/p/6502654.html

3.C++连接mysql数据库的两种方法 - 51CTO.COM  http://developer.51cto.com/art/201104/257338.htm

4.四种mysql可视化操作工具的对比 - 知识天地 - 博客园  https://www.cnblogs.com/mfryf/archive/2013/06/12/3132421.html   

一、 安装

1. 安装了mysql5.0版本

2.安装可视化工具,Navicat for mysql。 

选择要执行的sql语句,右键-运行已选择的,可以仅执行选中的语句。

3.安装mysql-connector-odbc-5.1.5-win32.msi 服务器程序。

通过ADO连接MySql数据库,首先得安装MyODBC服务器程序。安装好后配置:

win7系统:控制面板->系统和安全->管理工具->数据源(ODBC)->用户DSN->添加->选择MySQL ODBC 5.1 Driver,双击,填相关信息。

最后测试,弹出测试成功对话框,然后确定。然后就可以在C++中以ado方式连接数据库了。

 

 

上图中的Data Source Name:中的内容就是代码里DSN所对应的值。

正确的连接字符串示例:

DATABASE=%s;DSN=MySqlODBC;OPTION=0;PWD=%s;PORT=0;SERVER=localhost;UID=%s;

 

 

二、使用sql语句过程中遇到的问题

1.  data too long for column 'uid' at row 1

向表中插入汉字时出现这种情况。

原因:

1. 可能是因为数据库里的表设置的字符集不相同。例如:在同一个数据库中,存在utf8的表,也存在gbk_chinese_ci的表。

(也可能真是数据库字段里数据库确实过长,所以首先要排除这种情况)

 解决办法:

alter table `cms_activity_test` convert to character set gbk collate gbk_chinese_ci;(单独修改指定表的字符集)

网上还有其他办法,但是我只成功了这一种方法。

 

2. GUID和UUID

MySql中没有SYS_GUID(),需要在程序中生成guid
例如:

CREATE TABLE `tbl_test_measure` (
`code` CHAR(36) NOT NULL,
`name` VARCHAR(10),
PRIMARY KEY (`code`)
)
插入数据:

isnert into `tbl_test_measure` values (GUID.NewGuid(),'哈哈');
其中GUID.NewGuid()就是程序生成的guid。

 

Mysql中没有guid函数,有uuid函数

举例:

INSERT  into order ( id )  VALUES(UUID())    //36位

INSERT  into car_order ( order_id )  VALUES(REPLACE(UUID(),'-',''))   去掉4个“-”,32位

 

另外,MYSQL无法在默认值中设置UUID函数,实际上其它函数除TIMESTAMP之外都不可以。 

MYSQL的默认值目前只能是常数或者CURRENTTIMESTAMP,或者默认int auto_increment primary key

如果需要实现UUID为默认值的功能,则可以在该表的INSERT触发器中实现。

 

 

3. 日期类型:

1)、可以把日期当成字符串直接插入

把date类型当成字符串插入即可:'2017-12-18'

mysql中的日期相关格式:
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP 00000000000000(长度取决于显示尺寸)
TIME '00:00:00'
YEAR 0000

举例:

 

背景:rq字段信息为:20100901

 

SELECT * FROM tairlist_day WHERE rq>'2010-07-31' AND rq<'2010-09-01'

 

2)、使用:DATE_FORMAT将日期转换成字符串

SELECT * FROM tairlist_day WHERE DATE_FORMAT( rq, '%Y-%m-%d')>'2010-08-01' AND DATE_FORMAT( rq, '%Y-%m-%d')<'2010-08-03'

其中第1要在一个“宽松”的语法是被允许的:以任何标点符号作为日期部分和时间部分中的定界符,如:

一个 YYYYMMDD 或 YYMMDD 格式的数字,只要数字看起来像是一个日期。例如,19830905 和 830905 被解释成为 '1983-09-05 '。 

建议使用第2种

 

结合1. MySQL函数 - 逆心 - 博客园  http://www.cnblogs.com/kissdodog/p/4168721.html  

中的函数,可以实现很多功能

 

举例:查找1天之前的数据:

SELECT * FROM ORDER WHERE
OUT_TIME is NULL
and CREAT_TIME < SUBDATE( date_format(NOW(), '%Y-%m-%d %H:%i:%S'), 1)  

 

3)NOW()和sysdate()的区别

 mysql中日期函数还是比较常用的。主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别。

  NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间。

因为NOW()取自mysql的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好了,因此在整个语句执行过程中都不会变化。

执行下面这个例子就明白了:

SELECT NOW(),SYSDATE(),SLEEP(3),NOW(),SYSDATE()

先查询了NOW()和SYSDATE(),然后sleep了3秒,再查询NOW()和SYSDATE(),结果如下:

 

NOW()还有3个同义词,效果跟NOW()一样,而且都有2种形式写法:

LOCALTIME或LOCALTIME()
LOCALTIMESTAMP或LOCALTIMESTAMP()
CURRENT_TIMESTAMP或CURRENT_TIMESTAMP()

参考: MySQL中时间函数NOW()和SYSDATE()的区别 - PC君 - 博客园  http://www.cnblogs.com/pcheng/p/6004679.html

 

4.)str_to_date字符串转换为日期

mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期。

示例:分隔符一致,年月日要一致

 

select str_to_date(‘2014-04-22 15:47:06’,’%Y-%m-%d %H:%i:%s’)

 

举例:

SELECT * FROM ORDER
WHERE NUMBER='123'
and str_to_date(CREATTIME,'%Y-%m-%d %H:%i:%s') >= '2018-01-15 11:36:10'

 

 

 

4. You can’t specify target table for update in FROM clause错误解决方法:

MySQL之You can't specify target table for update in FROM clause解决办法 - 竹山一叶 - 博客园  https://www.cnblogs.com/jeffen/p/7016547.html

按照上面这篇文章中的方法就可以解决问题

错误的意思就是不能在同一表中查询的数据作为同一表的更新数据,解决方法就是再通过中间表筛选一遍。而且这个错误只在mysql中出现。

举例:

错误写法:(注意,只在mysql中出错,在sqlserver,oracle中,这种写法完全正确)

update CAR set LEAVE = 2
where NUMBER = '123'
and IN_TIME = (select max(IN_TIME) as intime from CAR)  

 

在mysql中的正确写法:(加一个中间表即可)

update CAR set LEAVE = 2
where NUMBER = '123'
and IN_TIME =
(
SELECT a.intime FROM
(
select max(IN_TIME) as intime from CAR
)a
)

 

5. NULL和空字符串

NULL:  

一是IS NULL 和IS NOT NULL关键字。如果要判断某个字段是否含用空值的数据,需要使用特殊的关键字。其中前者表示这个字段为空,后者表示这个字段为非空。在Select语句的查询条件中这两个关键字非常的有用。如需要查询所有电话号码为空的用户(需要他们补充电话号码信息),就可以在查询条件中加入is null关键字。

  二是Count等统计函数,在空值上也有特殊的应用。如现在需要统计用户信息表中有电话号码的用户数量,此时就可以使用count函数、同时将电话号码作为参数来使用。因为在统计过程中,这个函数会自动忽略空值的数据。此时统计出来的就是有电话号码的用户信息。如果采用的是空字符的数据,则这个函数会将其统计进去。统计刚才建立的两条记录时,系统统计的结果是1,而不是2。可见系统自动将Null值的数据忽略掉了。

判断NULL用is null  或者 is not null。 sql语句里可以用ifnull函数来处理
判断空字符串‘’,要用 ='' 或者 <>''。sql语句里可以用if(col,col,0)处理,即:当col为true时(非null,及非'')显示,否则打印0

 

参考:Mysql的空值与NULL的区别 - Leoxlu - 博客园  https://www.cnblogs.com/apache-x/p/5386287.html

 

 

6. datetime比较大小:

下面两种写法都得出了正确的结果,网上有人说第一种不对,但在我这儿是对的

SELECT * FROM carin WHERE in_time >= '2018-01-26 15:43:43'

select * from carin where unix_timestamp(in_time) >= unix_timestamp('2018-01-26 15:40:43')

 

 

SQL语句的使用可查询下面两个网址:

SQL COUNT() 函数  http://www.w3school.com.cn/sql/sql_func_count.asp

MySQL函数 - 逆心 - 博客园  http://www.cnblogs.com/kissdodog/p/4168721.html

 

posted on 2018-01-26 11:22  南枝  阅读(357)  评论(0编辑  收藏  举报