vlambda博客
学习文章列表

MySql与Navicat入门(中文显示与datetime微秒)

最开始学习用了一整天,而安装MySqlNavicat直到用c++插入第一条数据仅用了不到一天。安装方法如下,注意安装方法中有个大错特错的地方,就是my.ini绝对不能放在bin中,而必须放在根目录下,不然其中设置修改后不会生效我安装的mysql版本是官网下载的mysql-8.0.25-winx64.zip


安装与破解Navicat,版本是官网下载的navicat15:

MySql与Navicat入门(中文显示与datetime微秒)


安装配置易错点:

1.mysqld --install mysql时,必须用管理员启动cmd,不然会报错

MySql与Navicat入门(中文显示与datetime微秒)

2.修改密码: 输入mysql -u root -p后,会弹出Enter Password,输入

D:\mysql-8.0.25-winx64\data\LT23-GengShuang.err中的密码,而非自己随便想的密码,不然会报ERROR 104528000):Access denied for user root@localhost(using password: YES)

然后修改密码为root: ALTER user 'root'@'localhost' IDENTIFIED BY 'root';


至此,安装与配置都完成。在cmd或Navicat中操纵mysql都很容易可靠。但接下来就遇到了两大难题:


1.时间无法输入微秒;

2.无法输入中文,后来能输入了,但是在Navicat显示??

问题1花费约两个小时解决,尚能接受。方法是首先将datetime这种类型数据的长度设置为3,意思是显示毫秒,如果设置为6”,意思就是显示微秒。

MySql与Navicat入门(中文显示与datetime微秒)

然后,编程时用.:

MySql与Navicat入门(中文显示与datetime微秒)


至此问题1解决。


但第二个问题就耗时长达一整天! 为了解决中文显示为??的问题,不得已重装了Navicat,因为Navicat一旦创建了数据库,就无法更改字符集(charset)了!

在网上查找了非常久,没有一个完全说正确的。最终,我首先修改了my.ini并放到了根目录,然后重启了mysql服务,mysql就好了;然后重装了navicat并设置了多处字符集与排序规则(因为默认排序规则与mysql中的不一致),然后分别在mysqlnavicat(新建查询)中运行show variables like char%;show variables like coll%;查看字符集和排序规则,确认二者完全一样后,Navicat好了;第三,在程序中连接数据库后写了mysql_set_character_set(&mysql, "gbk");终于能使得c++能插入包含中文的数据,且navicat能够成功显示中文了。

具体来说,分三步:

1. 修改MySql的字符集,方法是在my.ini中设置(共三处,下图中蓝笔标注),千万注意my.ini必须放在根目录而不是bin目录!否则修改不会生效(注意collation-server那一句虽可用,但仍屏蔽,未生效):

MySql与Navicat入门(中文显示与datetime微秒)

my.ini中排序规则没有做设置,然后运行my.ini后发现排序规则自动变为utf8mb4_0900_ai_ci这种排序规则无法兼容老版本mysql,所以会导致数据向老版本迁移时出错。但目前我不会把所有的排序规则改为utf8mb4_general_ci(此规则兼容老版本,上面collation-server一句只能改mysqld的排序规则,其他两处用这句话会报错)

MySql与Navicat入门(中文显示与datetime微秒)

2. 修改Navicat的字符集与排序规则,仅在Navicat中就要设置三处。千万注意,如果已经建好了数据库,但跟cmd中的字符集不同的话,必须重装Navicat! 

MySql与Navicat入门(中文显示与datetime微秒)

Navicat第一处设置: 连接级别字符集,设置为自动:

MySql与Navicat入门(中文显示与datetime微秒)

Navicat第二处设置: 数据库级别字符集与排序规则:

MySql与Navicat入门(中文显示与datetime微秒)

Navicat第三处设置: 不设置表级别的字符集与排序规则(因为没有),但须设置表中各个varchar类型字段的必须设置,方法是表右键选择设计表,打开后设置各varchar变量的字符集与排序规则,注意每个varchar都需要设置:


3. 编程时连接数据库,必须设置为gkb,我尚不知道为何必须这样设置:

至此,问题解决。但是mysql记录数据时,注意字符串中一般的特殊字符都可以,却不能有单引号或双引号