为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧
2007-05-28 09:18
Repinted:
http://blog.csdn.net/class1/archive/2006/12/30/1469298.aspx
为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧
(可以根据你的喜欢选择相应的编码,如gb2312)
,即使你现在没有加上这句也能正常访问。
先说MySQL的字符集问题。Windows下可通过修改my.ini内的
-
# CLIENT SECTION
-
[mysql]
-
default-character-set=utf8
-
# SERVER SECTION
-
[mysqld]
-
default-character-set=utf8
这两个字段来更改数据库的默认字符集。第一个是客户端默认的字符集,第二个是服务器端默认的字符集。假设我们把两个都设为utf8,然后在MySQL Command Line Client里面输入“show variables like “character_set_%”;”,可看到如下字符:
character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_results latin1
character_set_server utf8
character_set_system utf8
其中的utf8随着我们上面的设置而改动。此时,要是我们通过采用UTF-8的PHP程序从数据库里读取数据,很有可能是一串“?????” 或者是其他乱码。网上查了半天,解决办法倒是简单,在连接数据库之后,读取数据之前,先执行一项查询“SET NAMES UTF8”,即在PHP里为
-
mysql_query
(
"
SET NAMES UTF8
"
)
;
(注意大写)
即可显示正常(只要数据库里信息的字符正常)。为什么会这样?这句查询“SET NAMES UTF8”到底是什么作用?
到MySQL命令行输入“SET NAMES UTF8;”,然后执行“show variables like “character_set_%”;”,发现原来为latin1的那些变量“character_set_client”、“character_set_connection”、“character_set_results”的值全部变为utf8了,原来是这3个变量在捣蛋。查阅手册,上面那句等于:
-
SET
character_set_client
=
utf8
;
-
SET
character_set_results
=
utf8
;
-
SET
character_set_connection
=
utf8
;
看看这3个变量的作用:
信息输入路径:client→connection→server;
信息输出路径:server→connection→results。
换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的,破坏性的。所以就转不回来了。
但这里要声明一点,“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。
接下来就说到MySQL在服务器上的配置问题了。岂不是我们每次对数据库读写都得加上“SET NAMES UTF8”,以保证数据传输的编码一致?能不能通过配置MySQL来达到那三个变量默认就为我们要想的字符集?手册上没说,我在网上也没找到答案。所以,从服务器配置的角度而言,是没办法省略掉那行代码的。
总结以下几点:
要保证select的返回与程序编码一致,即character_set_results与程序编码一致.
要保证程序编码与浏览器一致,即程序编码与<meta http-equiv="Content-Type" content="text/html; charset=?" />一致.
|
分享到:
相关推荐
utf8mb4是utf8的扩展,它不仅完全兼容utf8,还能处理更多的Unicode字符范围,包括现代社交媒体广泛使用的表情图标。 首先,确认MySQL服务器的版本,因为utf8mb4的支持始于5.5.3版。如果您的版本低于这个,你需要...
为了解决这个问题,MySQL引入了`utf8mb4`字符集,它完全支持4字节的UTF-8编码,能处理更多的Unicode字符。 从MySQL 5.5.3开始,`utf8mb4`被引入,而在MySQL 8.0中,`utf8mb4`已成为默认的字符集。这反映了对全球化...
- 如果使用的是MySQL 5.5以上版本,推荐使用`utf8mb4`字符集以支持更多的Unicode字符。 - 在进行任何修改之前,建议先测试新的字符集设置是否会影响现有的应用程序功能。 - 对于不同的Web框架和技术栈,设置字符集的...
例如,`SET NAMES 'utf8'` 告诉MySQL服务器客户端使用UTF-8编码,数据在传输过程中也将保持UTF-8格式,同时期望服务器返回的查询结果也以UTF-8编码。这个命令在大多数情况下能够确保数据的正确处理。 然而,`mysql_...
因此,相比GBK,UTF8在存储中文时会占用更多的空间,但对于支持多种语言的环境,尤其是需要国际化支持的网站或应用,UTF8是更好的选择,因为它具有广泛的设备和软件支持。 MySQL中的字符集设置有多个层次,包括...
最后,尽管“SET NAMES utf8”可以解决许多情况下出现的乱码问题,但还是建议检查并确保Web服务器和数据库服务器的字符集设置都一致。在Web开发过程中,也要确保HTML页面和数据库的字符编码匹配,以避免产生未知的...
init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake ``` 这里,`[client]` 和 `[mysql]` 部分设置了客户端连接的默认字符集,确保...
推荐使用utf8作为通用选择,因为它能支持更多语言。 - 当使用MySQL的C API时,通过设置`MYSQL_SET_CHARSET_NAME`属性来设定连接字符集,以简化管理。 - 对于PHP,短连接情况下,可以在连接后立即使用`SET NAMES`设置...
SET character_set_connection=utf8, character_set_results=utf8, character_set_client=utf8; ``` 5. **客户端工具设置** - 对于使用命令行工具或其他客户端连接MySQL的场景,确保客户端的字符集与MySQL服务器...
`utf8mb4`是`utf8`的超集,能够处理更多的Unicode字符,包括表情符号。 解决中文乱码问题的关键在于两个方面:服务器层面的字符集设置和客户端连接时的字符集设置。 1. **服务器层面的字符集设置**: - 打开MySQL...
要解决这个问题,你需要在MySQL配置文件中(通常为my.cnf)设置全局字符集为`utf8`或更现代的`utf8mb4`,后者支持更多的Unicode字符。重启MySQL服务后,新建立的数据库将默认采用这个字符集。 其次,创建数据库和表...
- **修改**:转换后的文件需要进行调整,添加`SET NAMES utf8;`语句,以确保数据在导入时使用UTF-8编码。同时,修改文件中表的charset设置,将`CHARSET=latin1;`改为`CHARSET=utf8;`。 - **恢复**:使用`mysqldump...
因此,在遇到乱码问题时,简单地将 UTF-8 修改为 GBK 并不能解决问题,反而可能造成更多的编码不一致问题。 #### 二、解决方案 解决 MySQL 中文乱码问题的方法主要有以下几种: 1. **在 JDBC 连接字符串中添加...
### MySQL中文乱码问题及其解决方案 #### 一、问题根源分析 ...此外,随着MySQL的发展,对于需要支持更多特殊字符的需求,推荐使用`utf8mb4`字符集,它能更好地支持Unicode标准,确保系统的兼容性和扩展性。
然后,即使客户端本身的字符集是 GBK,由于在插入数据前设置了 `SET NAMES utf8`,所以插入的数据仍然会被正确地按照 UTF-8 编码存储。 #### 七、总结 通过合理设置 MySQL 的字符集,可以有效避免因字符集不匹配...
1. MySQL服务器必须在编译时包含了GBK、GB2312和UTF8等字符集的支持。 2. 输入到数据库的数据必须是正确的UTF8编码。如果前端提交的数据不是UTF8,可能需要在存储前进行转码。 3. 数据的存储和读取操作都必须指定...
此外,可以添加`init-connect='SET NAMES utf8'`,这将在每次连接时强制使用`UTF-8`编码。 保存并关闭配置文件后,需要重启MySQL服务使改动生效。在Linux中,可以通过`/etc/init.d/mysql start (stop)`命令来启动或...