msyql 中文读写utf8编码及连接超时设置

本文介绍如何在MySQL中正确设置中文字符集,并提供超时设置指南,确保连接稳定。

本文主要描述中文与超时设置。


中文:

在mysql中,中文的存储读取不可避免,不过其设置却不是非常简单。


总的来说,让一个msyql表格支持中文,需要两个步骤。

1、数据库字符集设置

2、表格创建时字符集设置


1、数据库字符集设置

对于不同的系统配置是不同的

对于ubuntu 12.04 修改文件 /etc/mysql/my.cnf

在[client] 下 添加

default-character-set = utf8

在[mysqld]下添加

character-set-server=utf8


-------------------------------------------------------------------------

在新版本的mysql中,配置文件的位置发生了改变,文件具体位置在my.cnf中包含

在[mysqld]下添加

character_set_server=utf8
collation_server=utf8_general_ci

--------------------------------------------------------------------------


重启mysql:   sudo /etc/init.d/mysql restart


mysql执行以下命令可以得到


mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+


2、表格创建时字符集设置


CREATE TABLE `area_info` (
  `i_area_id` int(11) NOT NULL AUTO_INCREMENT,
  `s_name` char(50) DEFAULT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=1455 DEFAULT CHARSET=utf8;


格式为 CREATE TABLE tablename ( ... ) CHARSET=utf8; 

然后再insert tablename values (...);

可以select * from tablename; 发现已经显示中文:)


对于旧表,可以先

CREATE TABLE 新表( ... ) CHARSET=utf8;

然后

INSERT INTO 新表 SELECT * FROM 旧表; 

即可。


超时设置

需要对mysql进行超时设置,否则,如果无操作,对于mysql的连接会在28800秒(8小时)后中断。对于C++等来说,会带来小小的麻烦,一个简单的方法是增大超时,再结合一定的重连。

同样对于ubuntu 12.04 修改文件 /etc/mysql/my.cnf


在[mysqld]下添加

wait_timeout  = 2880000
interactive_timeout = 2880000

即可更改为


mysql> SHOW VARIABLES LIKE '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 2880000  |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 2880000  |
+----------------------------+----------+








<think>好的,用户想要用Go语言编写一个带有5秒超时时间的MySQL连接代码示例。我需要根据之前的对话和提供的引用信息来给出合适的回答。 首先,回顾用户之前的请求,他们需要Go连接MySQL的代码,之前的回答已经涵盖了基本的连接步骤,包括导入驱动、构建DSN、建立连接和验证。现在用户特别提到了超时设置,所以需要在这个基础上添加超时控制。 查看用户提供的引用,引用[1]中提到了MySQL的各种timeout参数,比如connect_timeout、interactive_timeout、wait_timeout等。但这里用户可能更关注的是应用层面的连接超时,而不是MySQL服务器端的设置。引用[3]和[4]讨论了连接池的配置,特别是超时时间与MySQL服务器wait_timeout的关系,确保应用层的空闲超时小于服务器的wait_timeout,避免连接被服务器断开导致错误。引用[5]中的Go示例代码展示了Ping测试和基本的连接方法,但没有涉及超时设置。 用户的需求是连接MySQL时设置5秒的超时。在Go中,通常可以通过两种方式实现:使用context.WithTimeout来控制连接和查询的超时,或者在DSN中添加参数设置连接级别的超时。 首先,DSN参数方面,Go的MySQL驱动(github.com/go-sql-driver/mysql)支持在DSN中添加timeout参数,例如timeout=5s,这样可以在建立TCP连接时设置超时。此外,还可以设置readTimeout和writeTimeout来控制读写超时时间。 其次,使用context包来为数据库操作设置超时。例如,在Ping或查询时使用context.WithTimeout,这样如果操作超过指定时间就会返回错误。 另外,还需要考虑连接池的设置,如SetConnMaxLifetime、SetConnMaxIdleTime等,这些参数影响连接的生命周期和空闲时间,避免与MySQL服务器的wait_timeout冲突。根据引用[3]的建议,应用层的空闲超时应小于服务器的wait_timeout,所以如果设置5秒超时,需要确保MySQL服务器的wait_timeout大于这个值,否则可能出现连接被服务器提前关闭的问题。 接下来需要整合这些信息到代码示例中。代码结构应包括DSN中的超时参数、context超时控制以及连接池的配置。同时,需要解释各个参数的作用和注意事项,比如驱动版本要求、服务器参数调整等。 需要检查驱动是否支持这些参数,例如timeout在DSN中的使用可能需要特定版本的驱动支持,可能需要用户升级驱动。另外,错误处理部分要包括超时错误的捕获和处理,帮助用户诊断连接问题。 最后,总结常见问题,如驱动版本、服务器配置、连接池参数设置等,确保用户能够顺利实现带有5秒超时MySQL连接。</think>### Go语言实现MySQL连接超时控制的解决方案 #### 一、核心需求分析 根据引用[1][3][4]的timeout参数关联性,实现以下功能: 1. 建立连接时的**TCP连接超时**(网络层) 2. 查询操作的**上下文超时**(应用层) 3. **空闲连接自动回收**(连接池管理) #### 二、完整代码示例 ```go package main import ( "context" "database/sql" "fmt" "time" _ "github.com/go-sql-driver/mysql" ) func main() { // 配置包含超时参数的DSN(关键参数) dsn := "user:password@tcp(127.0.0.1:3306)/dbname?" + "charset=utf8mb4&parseTime=True&timeout=5s&readTimeout=5s&writeTimeout=5s" // 创建数据库连接对象 db, err := sql.Open("mysql", dsn) if err != nil { panic(fmt.Sprintf("初始化失败: %v", err)) } defer db.Close() // 配置连接池参数(引用[4]建议) db.SetConnMaxLifetime(5 * time.Minute) // 连接最大存活时间 db.SetConnMaxIdleTime(50 * time.Second) // 必须小于MySQL的wait_timeout db.SetMaxOpenConns(10) db.SetMaxIdleConns(5) // 使用context控制连接超时 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // 带超时连接验证 if err := db.PingContext(ctx); err != nil { panic(fmt.Sprintf("连接验证失败: %v", err)) } fmt.Println("成功建立带超时控制的MySQL连接") } ``` #### 三、关键配置解析 1. **DSN参数**(引用[1][5]关联): - `timeout=5s`:TCP连接建立的超时时间 - `readTimeout=5s`:单次数据读取操作超时 - `writeTimeout=5s`:单次数据写入操作超时 2. **连接池参数**(引用[3][4]实践): ```go SetConnMaxIdleTime(50 * time.Second) // 必须小于MySQL的wait_timeout(默认28800秒) ``` 通过`show variables like 'wait_timeout'`可查看服务器配置[^1] 3. **上下文超时**: ```go ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) db.PingContext(ctx) ``` 这种模式可扩展到所有数据库操作 #### 四、注意事项 1. **驱动版本要求**:需使用`go-sql-driver/mysql v1.6.0+`(早期版本不支持部分参数) 2. **服务器配置检查**: ```sql SHOW VARIABLES LIKE '%timeout%'; -- 确保wait_timeout > 50秒[^1] ``` 3. **错误处理建议**: ```go if err != nil { if ctx.Err() == context.DeadlineExceeded { fmt.Println("操作超时") } } ``` --相关问题-- 1. 如何检测Go语言中的MySQL连接泄漏? 2. Go语言中如何实现MySQL事务的超时控制? 3. 如何动态调整MySQL连接池参数?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值