1

不知道为什么会这样,环境肯定有问题。我已将 db 声明为

CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET latin1 */

然后我有一个表声明为

CREATE TABLE `myabstract_table` (
  `key_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `varchar_field` varchar(128) NOT NULL
  PRIMARY KEY (`key_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

然后我通常用于这种情况的php代码:

function execSQL($conn, $sql, $values = false) {
  try {
    $stmt = $conn->prepare($sql);
    if ($values) 
      foreach($values as $param=>$value)
        $stmt->bindValue($param, $value);
      if ( ! $stmt->execute() ) {
        error_log ("PDO Error: ".json_encode($stmt->errorInfo()));
        return false;
      }
  } catch (PDOException $e) {
      error_log ("Exception: " . $e->getMessage());
      return false;
  }
  return $stmt;
}

然后将字符串(通过 INSERT 语句)保存到带有问号而不是非 ASCII 符号的db

PS。我set names 'utf8'在任何 sql 请求之前执行,所有 php 内容都为 UTF-8 配置,html 文档标题包含元标记,其中 UTF-8 被指定为字符集;我唯一没有尝试的是更改模式本身的默认字符集(目前是 latin1),因为我很确定它没有问题。或者是吗?

在此处输入图像描述

4

2 回答 2

2

好的,我找到了原因。还有一点我忘了提。是存储过程。这个过程是从 php.ini 插入不常见的 INSERT 行。

我认为,默认模式字符集会影响在没有显式字符集的情况下声明的过程 IN varchars 参数。我终于做了以下事情:

CREATE PROCEDURE `sp_myabstract_proc`(
  `prm_key_id` int(10),
  `prm_varchar_param` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci
)
BEGIN
-- some insert logic here
END;

CHARACTER SET utf8选项成功了)所以在我的例子中,mysql引擎正在处理prm_varchar_param,就像从模式属性继承的latin1一样。

于 2013-07-03T12:28:06.127 回答
0

您需要将数据库的字符集更改为 UTF-8 或Cyrillic characters的字符集。

Latin-1 无法对西里尔字符进行编码,这就是它们在数据库中显示为问号的原因。

编辑:我刚刚看到你用 UTF-8 字符集声明表,所以我很难过。

于 2013-07-03T10:22:27.490 回答