【问题标题】:php mysqli query returns null if field value contains "ñ"如果字段值包含“ñ”,则php mysqli查询返回null
【发布时间】:2011-07-22 06:12:59
【问题描述】:

我有一个名为 users 的数据库表,其中一个用户的姓氏包含“ñ” 当我从用户表中查询时,它为包含“ñ”的姓氏返回空值,但对其他人来说就很好。

【问题讨论】:

  • @footy> 我要怎么检查呢?顺便说一句,谢谢
  • @footy - 数据库与字体完全无关。除非您将字体存储在数据库中。
  • 检查您的表格是否支持字体类型。或检查您的 php 脚本是否以正确的字体类型保存。 编辑它的表而不是数据库.. sry :P。创建表格时,您必须提供CHARACTER SET=utf8;
  • 在这种情况下,表引擎是 InnoDB,排序规则是 latin1_swedish_ci。我认为它确实支持“ñ”。
  • 当问题只有模糊的描述而没有代码时,我不敢相信到目前为止有两个详尽的答案。

标签: php database character-encoding mysqli


【解决方案1】:

根据json_encode的文档:

此函数仅适用于 UTF-8 编码的数据。

如果您的数据是 latin1_swedish_ci,它将不接受ñ。我的建议是更改您的数据库并在任何地方使用 utf-8(这对我来说效果很好),或者尝试使用多字节函数将输入数据更改为 utf-8。像这样的东西应该可以工作:

<?php
$input = mb_convert_encoding( $yourstring, 'UTF-8', mb_detect_encoding( $yourstring ) );

再次;我认为对所有事情都使用 UTF-8 是更明智的做法,并且可以让您免于日后的麻烦。

【讨论】:

  • 谢谢!我会尝试 mb_convert_encoding() 因为我不是维护数据库的人。
  • 它以某种方式起作用,但它只省略了“ñ”,而是我尝试使用 htmlentities() 并且它起作用了。
  • @ThomasP 然后告诉维护数据库的人和你自己阅读the absolute minimum every programmer should know about unicode。这是一篇很好的文章,它解释了为什么正确处理它如此重要。
  • > 感谢您的文章。我真的会把这个寄给他。哈哈!
【解决方案2】:

我无法重现错误

<?php
ini_set('default_mimetype', 'text/html');
ini_set('default_charset', 'utf-8');

echo 'phpversion: ', phpversion(), "<br />\n";

$mysqli = connect();
echo 'mysqli server version: ', mysqli_get_server_version($mysqli), "<br />\n";
echo 'mysqli client version: ', mysqli_get_client_version($mysqli), "<br />\n";
echo 'mysqli proto info: ', mysqli_get_proto_info($mysqli), "<br />\n";
echo '<pre>mysqli charset: '; var_dump(mysqli_get_charset($mysqli)); echo "</pre>\n";


setup($mysqli);
$result = mysqli_query($mysqli, 'SELECT x FROM foo') or die(__LINE__.mysqli_error($mysqli));
while ( $row=mysqli_fetch_assoc($result) ) {
    echo '<pre>', $row['x'], "<pre>\n";
}

function connect() {
    $mysqli = mysqli_connect('localhost', 'localonly', 'localonly', 'test') or die(__LINE__.mysqli_connect_error());
    mysqli_set_charset($mysqli, 'utf8') or die(__LINE__.mysqli_error($mysqli));
    return $mysqli;
}

function setup($mysqli) {
    mysqli_query($mysqli, 'CREATE TEMPORARY TABLE foo (id int auto_increment, x varchar(32), primary key(id))') or die(__LINE__.mysqli_error($mysqli));
    $v = chr(0xC3). chr(0x91);
    mysqli_query($mysqli, "INSERT INTO foo (x) VALUES ('abc'),('$v')") or die(__LINE__.mysqli_error($mysqli));
}

在我的电脑上打印

phpversion: 5.3.5
mysqli server version: 50508
mysqli client version: 50007
mysqli proto info: 10

mysqli charset: 

object(stdClass)[2]
  public 'charset' => string 'utf8' (length=4)
  public 'collation' => string 'utf8_general_ci' (length=15)
  public 'dir' => string '' (length=0)
  public 'min_length' => int 1
  public 'max_length' => int 3
  public 'number' => int 33
  public 'state' => int 1
  public 'comment' => string 'UTF-8 Unicode' (length=13)

abc

Ñ

【讨论】:

  • 感谢您的努力,但我发现问题不在 mysqli 中,而是在 json_encode() 中。呵呵!抱歉,我没有提供代码示例。我的错。
猜你喜欢
  • 2018-05-19
  • 2012-08-10
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多