【问题标题】:inserting unicode characters into mysql database shows ??????? in field将 unicode 字符插入 mysql 数据库显示 ???????在现场
【发布时间】:2010-07-14 17:38:42
【问题描述】:

大家好,我在尝试将我的网络应用程序转换为支持 unicode 字符时遇到了麻烦。我有以下脚本试图将俄语字符插入我的 mysql 数据库但只输出??????在我的 mysql 数据库字段中。我已将 php.ini 中的默认字符集更改为 UTF-8,并将表字段修改为排序规则:utf8_unicode_ci。有人有什么想法吗?

mb_language('uni'); mb_internal_encoding('UTF-8');

                $sql = 'SET NAMES utf8';
$stmt = $conn->prepare($sql);
$result=$stmt->execute();

$sql = 'SET CHARACTER SET utf8';
$stmt = $conn->prepare($sql);
$result=$stmt->execute();

$sql = 'INSERT INTO topic (topic_id,topic_title) VALUES (?,?)';
$stmt6 = $conn->prepare($sql);
$result=$stmt6->execute(array(0,"дравствуйте"));
?>

显示创建表编辑

CREATE TABLE `topic` (
 `id` mediumint(8) NOT NULL AUTO_INCREMENT,
  `topic_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

 `description` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

 PRIMARY KEY (`id`),
 FULLTEXT KEY `description` (`description`),
 FULLTEXT KEY `topic_title` (`topic_title`),
 FULLTEXT KEY `topic_title_2` (`topic_title`,`description`),
 FULLTEXT KEY `description_2` (`description`)
) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=latin1

【问题讨论】:

  • 你在哪里看到问号?
  • 在我试图插入字符的 mysql 数据库中的 topic_title 字段中。当我回显这些字符时,它们在 php 中表现良好。
  • 困惑...您在 MySql CLIENT 中看到问号,但数据是正确的 unicode 并且在从数据库查询时通过 PHP 打印正常?
  • 没有大声笑,对不起,当我在 phpmyadmin 中查看字段时,在 unicode 应该是的字段中,它显示 ???????,但是当我在 php 中回显这些字符时(没有查询)他们显示。我只是想强调一下 php 配置似乎没问题。
  • 我发现 UTF-8 在不使用 mb_ 函数和不调用 SET NAMES 的情况下也能正常工作。您的 PHP 和 MySQL 根本不需要知道您使用的是 UTF-8。正如 Wrikken 所指出的那样,您只需要确保浏览器确实如此。

标签: php mysql


【解决方案1】:

我使用以下 sql 让它工作:

ALTER DATABASE mydatabase charset=utf8;

【讨论】:

    【解决方案2】:

    如果您在 mysql 浏览器或 mysql cli 上看到那些 ??????,请确保调整程序上的字符集设置,即使条目已正确添加到数据库中,正确显示它们也取决于客户端字符集设置。

    【讨论】:

    • 是的,但它们在数据库中显示不正确,首先是 ???????,然后我删除了 mb_functions 并调用了 Mark 提到的集合名称,现在它是 D´Ñ €Ð°Ð²ÑÑ,вуйÑ,е 在数据库中
    【解决方案3】:

    我倾向于认为问题不在于 MySQL。

    您正在将非 ASCII 字符串作为文字输入 PHP 脚本。您确定“дравствуйте”字符串将以 UTF-8 编码发送到 MySQL 服务器吗?

    我已经看到一些问题,在 PHP 和 MySQL 中没有 ASCII 字符,在操作系统、PHP 解释器(它继承了操作系统的默认值)、数据库和开发工具(编码.php 文件)。如果所有四个都配置为相同的编码,它应该可以工作。

    您说您的 php.ini 配置为 UTF-8。如果您的源 php 文件不是 UTF-8 格式,它将无法工作!因此,请检查您的 php 文件是否编码为 UTF-8,以及 mysql 客户端是否也配置为 UTF-8。

    一个常见的错误是忘记将 MySQL 客户端也配置为 UTF-8 并且由于 MySQL 客户端应用程序的字符集问题而无法检查数据库中的数据。

    回家有帮助!

    【讨论】:

    • 当我说 show create database 时,它​​说 ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=latin1,这可能是个问题吗?另外,当您提到将 php 文件转换为 utf-8 时,您到底是什么意思。再次感谢 axmachado
    【解决方案4】:

    通常情况下,(如果您引用的文件也是 utf-8 格式)PHP 和 MySQL 方面是可以的,但 HTTP / HTML 方面不是。

    • 您是否发送Content-Type: text/html;charset=utf-8 标头?
    • HTML 页面上是否有 <meta> 元素声明另一个字符集然后是 utf-8?

    所以,在获得更多信息之后:在“普通”PHP 脚本中,我收集到它可以工作(?),但在 PHPMyAdmin 中却没有(这应该使它更像是 superuser.com b.t.w. 的候选者)。使用的 PHPMyAdmin 版本会很好,但通常情况下,如果非 PHPMyAdmin 脚本的其余部分有效,则 PHPMyAdmin 配置中的 $cfg['DefaultCharset'] = 'utf-8'; 应该有效。如果没有:更新到最新的 PHPMyAdmin 版本,如果仍然无法使用,请提交错误报告。

    【讨论】:

    • 我有meta元素,但是当你说header时,你如何修改你的http设置?
    • 'default_charset' 设置通常应该可以,但仔细检查也无妨(例如在 Firefox 中使用 LiveHTTPHeaders)。
    【解决方案5】:

    请从 PHPMYADMIN 将排序规则更改为 utf32_general_ci,他们将支持并且在某些情况下它会使现有的“????”也纠正一个。

    PHP Myadmin illustration purpose

    【讨论】:

      【解决方案6】:

      用于存储表情符号的数据库活动

      1) default-character-set = utf8mb4 under [client]

      2) [mysql]下的default-character-set = utf8mb4

      3) 在 [mysqld] 下跟随 字符集客户端握手 = FALSE 字符集服务器 = `utf8mb4` 排序服务器 = `utf8mb4_unicode_ci`

      4) 使用以下命令重启 Mysql 服务器

      `sudo 服务 mysql 停止` `sudo 服务 mysql 启动`

      5) ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

      6) ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

      7) 设置名称 utf8mb4;

      【讨论】:

      • 您能否补充说明这是如何解决问题的?
      • 这与旧问题完全无关。
      猜你喜欢
      • 2017-09-21
      • 2015-08-08
      • 1970-01-01
      • 2011-01-30
      • 2013-05-05
      • 2020-08-30
      • 2013-07-05
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多