【问题标题】:PHP's MYSQLI get_charset returns wrong charsetPHP 的 MYSQLI get_charset 返回错误的字符集
【发布时间】:2017-09-24 04:47:34
【问题描述】:

我愿意:

$conn->real_connect($host,$user,$pass,$someUTF8Schema);

然后我打印我从中得到的:

$conn->get_charset()

它是:

charset = "latin1" collat​​ion = "latin1_swedish_ci"

即使我的架构和数据库中的所有表都是 utf8。

为了证明这一点,我这样做了:

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = $someUTF8Schema;
->
# DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
'utf8', 'utf8_unicode_ci'

为什么 PHP MySQLi 返回错误的排序规则?谢谢!

【问题讨论】:

  • 我相信可以在数据库表级别定义不同的字符集

标签: php mysql mysqli collation


【解决方案1】:

有很多事情需要协调。

  1. 您在 PHP 中操作的字符是什么编码?
  2. 您是否通过连接调用或set_charsetSET NAMES 告诉MySQL 进行编码?
  3. 您可以通过 `get_charset() 获取它。
  4. 但是database/table/column不一定要和那个一样--
  5. 创建数据库时,您可以为该数据库中的表建立默认字符集。
  6. 创建表时,您可以通过为该表中的显式指定字符集来覆盖该默认值。
  7. 指定列时,您可以通过显式指定该列的字符集来覆盖该默认值。
  8. INSERTing 插入的字节根据第 2 步进行解释时,然后转换为列的字符集 (#7)。
  9. 同样,当SELECTing 时,如果需要,字符会重新转换(#7->#2)。

注意,我没有提到COLLATION,只提到CHARACTER SET。它们是不同的动物。 COLLATION 指的是如何比较给定CHARACTER SET 中的字符。

请参阅Trouble with utf8 characters; what I see is not what I stored 的最佳实践部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2013-03-21
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多