使用PHP输入某些字符到我的MySQL数据库时,我所遇到的一些问题。 我在做什么是提交用户输入的文本到数据库。 我想不出什么,我需要改变,以允许任何性格的人通过PHP的,因为它是假设被放入数据库,打印退了出去。
我的MySQL排序规则是:latin1_swedish_ci
就在我从我的形式将文本发送到数据库我使用的数据mysql_real_escape_string()。
下面的示例
本文:
�People are just as happy as they make up their minds to be.�
� Abraham Lincoln
是假设是这样的:
“People are just as happy as they make up their minds to be.”
― Abraham Lincoln
Answer 1:
正如其他人所说,你需要转换为UTF-8从端到端的,如果你想支持“特”字。 这意味着你的网页,PHP,MySQL连接和mysql表。 该网页是相当简单,只需使用元标签的UTF8。 理想的情况是你的头会说UTF8也。
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
设置你的PHP使用UTF8。 事情可能会反正工作,但它是做一个很好的措施:
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
对于MySQL,你想你的表转换为UTF-8,无需导出/导入。
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8
你可以,而且应该,配置MySQL为默认UTF8。 但你也可以运行查询:
SET NAMES UTF8
为建立连接后的第一个查询,将“转换”数据库连接到UTF8。
这应该解决您所有的字符显示问题。
Answer 2:
这个问题的最有可能的原因是数据库连接设置为latin1
但你喂养它在文本UTF-8编码。 要解决这个最简单的方法是将您的输入转换成客户所期待的:
$quote = iconv("UTF-8", "WINDOWS-1252//TRANSLIT", $quote);
(什么MySQL调用latin1
是Windows 1252在世界其他地区。)请注意,许多字符,如报价破折号U + 2015年您使用那里,不能在此编码表示的,将被转换成别的东西。 理想情况下,你应该列编码改为utf8
另一种解决方案:设置数据库连接utf8
。 没关系的列是如何编码:MySQL的内部从连接编码到存储编码转换的文字,你可以保持的列latin1
,如果你想。 (如果你这样做,报价破折号U + 2015年将变成一个问号?
因为它不是在latin1
)
如何设置连接的编码取决于你使用的库:如果您使用已弃用MySQL库是mysql_set_charset,如果库MySQLi它的mysqli_set_charset,如果PDO添加encoding=utf8
的DSN。
如果你这样做,你就必须设置页面编码为UTF-8与Content-Type头。 否则,你将有同样的问题与浏览器:喂养它在UTF-8时,它的期待别的文字编码:
header("Content-Type: text/html; charset=utf-8");
Answer 3:
如果从头开始提供的解决方案是有帮助的。 把所有可能的连接为UTF-8的确是最安全的。 UTF-8是在网络上的各种原因中最常用的字符集。
一些建议和提醒一句:
- 复制你想要一个独特的前缀来消毒表(tmp_)
- 虽然你的数据库连接被强制为utf8,请检查常规设置整理,改为utf8_bin如果还没有完成
- 你需要在本地服务器上运行此
- 有趣的炭误差主要是由于使用UTF-8配置混合LATIN1。 该解决方案是专为这一点。 这可能与LATIN1,但我没有检查这等二手字符集工作
- 广泛复制回原之前检查这些tmp_tables
建立所需的魔法2阵列:
$chars = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES, "UTF-8");
$LATIN1 = $UTF8 = array();
while (list($key,$val) = each ($chars)) {
$UTF8[] = $key;
$LATIN1[] = $val;
}
现在建立你所需要的程序:(表 - >)rows->字段,在每个字段调用
$row[$field] = mysql_real_escape_string(str_replace($LATIN1 , $UTF8 , $row[$field]));
$q[] = "$field = '{$row[$field]}'";
最后,建立和发送查询:
mysql_query("UPDATE $table SET " . implode(" , " , $q) . " WHERE id = '{$row['id']}' LIMIT 1");
Answer 4:
改变MySQL的排序规则utf8_unicode_ci或utf8_general_ci,包括表和数据库。
Answer 5:
您将需要设置你的数据库是UTF-8是的。 有很多方法可以做到这一点。 由鲍勃迪伦的配置文件,通过phpMyAdmin的或致电其之前插入PHP函数(对不起记忆空白),并更新了MySQL。
不幸的是,我认为你将不得不重新输入您之前输入的任何数据。
有一件事你还需要知道,从经验的personnal,确保所有表的关系具有相同的排序规则,否则您将无法加入他们的行列。
作为参考: http://dev.mysql.com/doc/refman/5.6/en/charset-syntax.html
而且,我可以是一个Apache的设置。 我们已经经历了“免费托管”服务器上,以及我哥哥的服务器上的同样的问题。 一旦切换到另一台服务器,所有的系统字符的变得整齐。 请验证是否你的Apache设置,抱歉,我不能在Apache的配置bting更多的光。
Answer 6:
摆脱一切,你只需要遵循这两点,对于特殊语言的字符每一个问题将得到解决。
1,您需要定义表的排序规则是utf8_general_ci。
2-定义<meta http-equiv="content-type" content="text/html; charset=utf-8">
在头标记后的HTML。
2 -你需要定义mysql_set_charset('utf8',$link_identifier);
在这里你做出像“mysql_select_db”数据库的选择后与数据库和正确的连接在文件中使用“mysql_set_charset”这将允许您添加和检索数据在正确的什么都它是语言。
文章来源: PHP/MySQL encoding problems. â�� instead of certain characters