gpt4 book ai didi

php - 什么可能导致问号而不是非 ASCII 符号?

转载 作者:行者123 更新时间:2023-11-29 06:48:00 24 4
gpt4 key购买 nike

想不通为什么会这样,环境肯定有问题。我将 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 符号

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

enter image description here

最佳答案

好的,我找到原因了。还有一点我忘了提。它是存储过程。此过程是直接从 php 插入行,而不是通常的 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 就像处理从 schema 属性继承的 latin1。

关于php - 什么可能导致问号而不是非 ASCII 符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17444183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com