mysql php 插入乱码 编码问题总结

SET NAMES x
相当于
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

以下从MySQL5.0官方文档上摘录了相关内容,并翻译,说明了相关系统变量的用处:

What character set is the statement in when it leaves the client?
statement离开客户端的时候是什么字符集?

The server takes the character_set_client system variable to be the character set in which statements are sent by the client.
客户端送过来的statement,服务器认为它的字符集是系统变量character_set_client的值。

What character set should the server translate a statement to after receiving it?
服务器收到一个statement后,会把它转换成什么字符集?

For this, the server uses the character_set_connection and collation_connection system variables. It converts statements sent by the client from character_set_client to character_set_connection (except for string literals that have an introducer such as _latin1 or _utf8). collation_connection is important for comparisons of literal strings. For comparisons of strings with column values, collation_connection does not matter because columns have their own collation, which has a higher collation precedence.
为了这一用途,服务器使用系统变量character_set_connection和collation_connection。它把客户端传来的 statement, 从character_set_client字符集转换成character_set_connection字符集(除非字符串中有 类似_latin1或者_utf8的字符集声明)。collation_connection对于字符串的比较是非常重要的。对于字符类型的字段值的比 较,collation_connection是不起作用的。因为字段有自己的collation,有更高的优先级。

What character set should the server translate to before shipping result sets or error messages back to the client?
在结果集由服务器传递给客户端之前,需要转换成什么字符集?

The character_set_results system variable indicates the character set in which the server returns query results to the client. This includes result data such as column values, and result metadata such as column names.
character_set_results系统变量表明了服务器返回查询结果时使用的字符集。返回的数据,有比如字段的值和元数据(例如字段名)。

If you are using the mysql client with auto-reconnect enabled (which is not recommended), it is preferable to use the charset command rather than SET NAMES. For example:
如果你使用mysql客户端的自动重连(不推荐使用),最好用charset命令,而不是SET NAMES。例如:

mysql> charset utf8
Charset changed

The charset command issues a SET NAMES statement, and also changes the default character set that is used if mysql reconnects after the connection has dropped. 
charset命令发出了一个SET NAMES语句,并且连接断开后自动重连时使用的缺省字符集也被修改了。

The database character set and collation are used as default values if the table character set and collation are not specified in CREATE TABLE statements. They have no other purpose.
如果CREATE TABLE中没有明确指出字符集和collation,那么database字符集和collation将做为缺省值,它们没有其他的用处。

The character set and collation for the default database can be determined from the values of the character_set_database and collation_database system variables. The server sets these variables whenever the default database changes. If there is no default database, the variables have the same value as the corresponding server-level system variables, character_set_server and collation_server.
缺省database的字符集和collation可以通过系统变量character_set_database和 collation_database查看。服务器当缺省database改变时设置这些变量的值。如果没有缺省的database,这些变量的将与对应 的服务器级的系统变量-character_set_server和collation_server的值相同。

The table character set and collation are used as default values if the column character set and collation are not specified in individual column definitions. The table character set and collation are MySQL extensions; there are no such things in standard SQL.
表的字符集和collation会作为缺省值,如果列的定义中没有指明字符集和collation的话。

Every “character” column (that is, a column of type CHAR, VARCHAR, or TEXT) has a column character set and a column collation.
每个“字符”字段(即CHAR、VARCHAR或者TEXT类型的字段)都有一个字段字符集和字段校验(collation)。

Every character string literal has a character set and a collation.
每个字符串有一个字符集和一个较验。

A character string literal may have an optional character set introducer and COLLATE clause:
每个字符串有一个可选的字符集introducer和COLLATE子句:

[_charset_name]'string' [COLLATE collation_name]

Examples:

SELECT 'string';
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;


MySQL 的字符集支持(Character Set Support)有两个方面字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

我们可以用下面命令检查MySQL当前字符集信息:

show variables like “character_set_%”;
如下:
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/  |

show variables like “collation_%”;
如下:
| collation_connection | latin1_swedish_ci |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |

MySQL4.1或以上版本的系统预设的编码是UTF-8
| character_set_system     | utf8                       |


根据以上设置,问题提出:
从Latin1的表table1里读出中文数据(utf8) 插入到latin1的表table2里出现乱码问题
首先从table1读取时所用编码character_set_results 是latin1,读出时utf8格式的数据正常,
而再插入的时候,假如不加以声明,
数据库会把由PHP传递的数据默认为character_set_client 字符集来处理。即把latin1转换为UTF-8,然后插入
而我们的数据本来就已经是utf8格式,再经过一次latin到utf8的编码就成了乱码了,因此产生了问题

解决办法:
就是在插入之前mysql_query("set names utf8");
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于MySQL中文插入乱码问题,有几种可能的原因和解决方法。以下是一些常见的情况和解决方案: 1. 数据库字符集设置不正确:请确保数据库字符集设置为UTF-8或UTF8mb4。可以使用以下语句进行检查和修改: - 检查字符集:`SHOW VARIABLES LIKE 'character_set_database';` - 修改字符集:`ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;` 2. 数据库连接字符集设置不正确:请确保在连接数据库时设置正确的字符集,例如在连接前执行以下语句: - 对于PHP:`mysqli_set_charset($conn, 'utf8mb4');` - 对于Java:`connection.createStatement().execute("SET NAMES utf8mb4");` 3. 表字段字符集设置不正确:在创建表时,请确保将字符集设置为UTF-8或UTF8mb4。例如: `CREATE TABLE your_table_name (column_name VARCHAR(255) CHARACTER SET utf8mb4);` 4. 数据插入编码问题:确保插入的数据使用了正确的编码方式。如果数据源是UTF-8编码的文本文件,可以使用`LOAD DATA INFILE`命令来导入数据: `LOAD DATA INFILE 'your_file.txt' INTO TABLE your_table_name CHARACTER SET utf8mb4;` 5. 数据库驱动程序问题:某些数据库驱动程序可能存在默认字符集设置不正确的问题。请确保使用最新版本的驱动程序,并检查相关文档了解如何设置字符集。 如果以上方法都无效,还可以尝试使用转码函数来处理中文插入乱码问题,例如使用`CONVERT`函数或编码转换工具。 希望这些解决方案对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值