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