也许我对此还没有足够的了解,所以我正在寻找一个方向。
我们所有的表都显示了latin1_swedish_ci的排序规则。这是我在mysql变量中看到的内容:
collation connection utf8_general_ci
(Global value) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci
现在,我们经常看到存储在数据库中的utf8(或者至少是外语内容),并且它正确呈现。整理是否与此无关?
在用户输入上使用像php addslashes()之类的东西 - 这是否足够?或者,这会留下注射机会吗?
编辑: 所以,看看完整的整理/字符集设置,至少在phpmyadmin中,我看到:
character set client utf8
(Global value) latin1
character set connection utf8
(Global value) latin1
character set database latin1
character set filesystem binary
character set results utf8
(Global value) latin1
character set server latin1
character set system utf8
character sets dir /usr/share/mysql/charsets/
collation connection utf8_general_ci
(Global value) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci
答案 0 :(得分:2)
collation仅描述用于比较特定字符集的字符的规则。一条规则可能是a
等于A
,b
等于B
等,或者ß
等于ss
,{ {1}}等于ä
等等。
要显式转义MySQL的字符串,请使用mysql_real_escape_string
。此函数与addslashes
相反,mysql_escape_string
将连接的实际字符编码考虑在内。
但您需要使用mysql_set_charset
设置连接的字符编码。因为否则将无法识别更改(请参阅C API Functions Description – mysql_real_escape_string()
):
如果需要更改连接的字符集,则应使用
mysql_set_character_set()
函数,而不是执行ae
(或SET NAMES
)语句。mysql_set_character_set()
的作用类似于SET CHARACTER SET
,但也影响mysql_real_escape_string()
使用的字符集,SET NAMES
没有。
答案 1 :(得分:0)
我们所有的表都显示了latin1_swedish_ci的排序规则 外语内容呈现正确
您的数据库有问题 它将无法存储非拉丁字符或无法正确排序/过滤数据库内容。
要存储外来字符,应为表设置utf8字符集。以及连接字符集。
如果你的charsets只有latin1和utf8,那么在用户输入上使用像php addslashes()这样的东西 - 这还不够吗?
addslashes就足够了。 但其余的都是错的。