正在对数据库和服务器进行编码


Encoding database and server

我正在使用PHP脚本将数据从外部导入到我的数据库MYSQL中。从查询将我的数据库字符集编码为utf8

ALTER DATABASE DEFAULT CHARSET 'utf8';

然后我执行了一个查询,通过查看所有字符集

SHOW VARIABLES LIKE 'character_set%';

输出为:

+--------------------------+----------------------------+
| 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     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

正如我们所看到的,character_set_database被设置为utf8,但如果我从我的PHP脚本中写一段代码来查看编码为

echo $charset = mysql_client_encoding($cn);

输出为CCD_ 3。根据以上查询,latin1仅用于服务器。有人能告诉我我到底缺了什么吗?因为我无法将我的中文和日文字符编码到数据库中。

编辑

我正在从外部导入一个数据库,该数据库的unicode字符为我的上网主页和嶏紞鎴戠殑中文、日语和其他不同的语言。但当我将数据导入数据库表时,我会得到?????而不是上面的字符。我如何对这些字符进行编码?它是utf-8还是16,我如何识别哪种编码将支持这些字符?

character_set_database只是指该DB中任何已创建表的默认字符集,我认为。因此,将其设置为UTF8并没有帮助,我建议如下:

每次初始化数据库连接时,我都会执行$db->query("SET NAMES 'utf8'");

谈论集合名称https://stackoverflow.com/a/1650834/1221902

评论家的更多片场名称

它将取决于您的MySQL/PHP版本,以获得合适的函数,该函数将是"SET NAMES 'utf8'"查询的更好替代方案。

SET NAMES"x"语句等效于以下三个语句:

SET character_SET_client=x;SET character_SET_results=x;SET character_SET_connection=x;

发件人http://dev.mysql.com/doc/refman/5.1/en/charset-connection.htmlMySQL5.1(很多人仍然使用5.1)

character_set_results系统变量表示字符集其中服务器向客户端返回查询结果。这包括结果数据(如列值)和结果元数据(如列姓名。

您缺少客户端编码
虽然上述变量只是服务器端的变量,但您必须使用设置客户端编码

mysql_set_charset()

正如您所说,您使用的是过时的PHP版本,除了升级PHP/切换驱动程序之外,您唯一的选择是SET NAMES <actual data encoding>集合名称查询。

事实证明,你的问题不是设置连接编码,而是一些神秘的"导入"。由于你没有提供任何细节,我只能猜测
如果您正在导入一些mysql-dump,请检查表定义。字符集很可能是错误的。你可以简单地通过搜索来改变它;代替