2017-04-26 55 views
0

我做的:PHP中的MySQLi get_charset返回错误的字符集

$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返回错误的归类?谢谢!

+0

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

回答

0

有很多事情需要协调。

  1. 什么编码是你在PHP中操作的字符?
  2. 你有没有告诉MySQL,通过连接调用编码或set_charsetSET NAMES
  3. 你可以通过`get_charset()获取。
  4. 但数据库/表/列不必是相同 -
  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的最佳实践部分。