[英]Having trouble saving strings to MySQL in UTF-8
我在編碼某些文件時遇到麻煩。 在我的PHP程序中,我得到一個txt文件。 使用foreach並從該文件獲取每一行並做一個表,接下來我嘗試將這些數據放入我的數據庫,並且在插入后我在數據庫中沒有波蘭字母。 我的數據庫,表和所有字段都有utf8_unicode_ci,當我使用phpmyadmin進行插入時,所有字母均正常。 我嘗試使用detect_encoding($ row),它檢測ASCII解碼。 如何在數據庫中插入波蘭語字母? 請幫忙。
我的數據庫連接:
try{
$dbh = new PDO('mysql:dbname=google;host=localhost;','root','');
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$dbh -> query ('SET NAMES utf8');
$dbh -> query ('SET CHARACTER_SET utf8_unicode_ci');}
我嘗試
$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));
和
$url = Encoding::toUTF8($url);
還有ofc iconv還有其他想法嗎?
我插入的所有內容都可以,它是一個示例:
PDOStatement Object ( [queryString] => insert into `site` values ("","meblegdańsk.pl","1") )
您的mysql查詢錯誤。 它是SET CHARACTER SET utf8_unicode_ci
(請注意空格,而不是SET
和CHARACTER
之間的下划線。這可能是引起問題的最可能原因。
在某些奇怪的MySQL配置上,您可能需要設置其他與字符編碼有關的內容(但通常不要這樣做,不要不必要地弄亂這些內容): http : //dev.mysql.com/doc/refman/5.0/zh /charset-connection.html
順便說一句,這將無法mb_detect_order
工作(除非您首先使用了mb_detect_order
):
$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));
如果要將latin2字符轉換為utf-8,但如果它們已經是utf-8,則不要理會它們,您應該這樣做:
$url = mb_convert_encoding($url, 'UTF-8',array ('UTF-8', 'ISO-8859-2'));
// or
mb_detect_order(array ('UTF-8', 'ISO-8859-2'));
$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));
抱歉,如果您以前已經使用過mb_detect_order()
。 給其他人的注釋:應該用可能期望使用的其他編碼代替ISO-8859-2,這可能取決於您使用的語言。在大多數西歐國家/地區,ISO-8859-1是通常使用的1-字節字符編碼。
無論如何,這允許檢查給定的字符串是否為有效的UTF-8(因此不會對其進行更改),或者是否為無效的UTF-8,則假定它為ISO-8859-2並進行轉換。 該順序很重要,因為每個字符串都是有效的ISO-8859-2,並且您將永遠無法“回退”到UTF-8。 我當時還假設當您說ASCII時,您的意思是ISO-8859-2(它們不是同一回事)。
另外,為了使答案完整,我還想提醒您,您應該確保表中的每一列也都設置為使用utf8編碼。
我懷疑mb_detect_encoding()無法按照您的方式工作:
字符串mb_detect_encoding(字符串$ str [,混合$ encoding_list = mb_detect_order() [,bool $ strict = false]])
如果省略第二個參數,則通常在兩種編碼之間進行選擇 :
Array
(
[0] => ASCII
[1] => UTF-8
)
最后,您要詢問波蘭語文字是ASCII還是UTF-8,然后將結果轉換為UTF-8。 問題在於:
很難說為什么在沒有示例數據的情況下將ASCII
作為輸出獲得-如果文本顯然不是UTF-8,PHP可能默認為ASCII,但是將嚴格的編碼檢測標志設置為false
會無濟於事。
我建議您重新考慮為什么首先需要檢測編碼。 如果應用程序不需要輸入文件采用特定的編碼,並且無法更改此要求,則建議您編譯波蘭語文本中的典型編碼列表,並使用mb_detect_encoding()
進行輸入。
順便說一句,設置連接編碼的推薦方法是DSN中的charset
參數:
$dbh = new PDO('mysql:dbname=google;host=localhost;charset=utf8','root','');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.