2014-11-06 62 views
0

請在下面找到錯誤的堆棧跟蹤的最初幾行: (列sl是我在存儲過程的代碼已經使用)ColdFusion中使用MySQL NativeError代碼1366和SQLSTATE HY000處理

Incorrect string value: '\xC2\x80\xC2\x99t ...' for column 'sl' at row 1 at 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946):946 at 
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985):2985 at 
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631):1631 at 
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723):1723 at 
com.mysql.jdbc.Connection.execSQL(Connection.java:3283):3283 at 

and so on.. 

存儲過程代碼,CODE II這是越來越從CODE稱爲I提到如下:

CODE II

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`mystuff`@`%` PROCEDURE `usp_sg_ins_fv3`(IN `na` BIGINT, IN `sb` VARCHAR(200), IN `sc` INT, IN `se` INT, IN `sf` VARCHAR(200), IN `sg` VARCHAR(200), IN `sh` VARCHAR(500), IN `si` VARCHAR(200), IN `dj` DATETIME, IN `sk` VARCHAR(200), IN `sl` VARCHAR(500), IN `sm` VARCHAR(200) 

, IN `sn` VARCHAR(50)) 
BEGIN 
    INSERT INTO sgfDatav3 
       (
       a_bi, 
       b_vc, 
       c_int, 
       e_int, 
       f_vc, 
       g_vc, 
       h_vc, 
       i_vc, 
       j_dt, 
       k_vc, 
       l_vc, 
       m_vc, 
       n, 
       myTimestamp_dt 
       ) 
      VALUES 
       (
       na, 
       sb, 
       sc, 
       se, 
       sf, 
       sg, 
       sh, 
       si, 
       dj, 
       sk, 
       sl, 
       sm, 
       sn, 
       CURRENT_TIMESTAMP() 
       ); 
END 

CODE我:這我使用獲得通過Sendgrid

<cftry>    
<cfset incomingData = toString(getHttpRequestData().content) /> 
<cfset djs = DeserializeJSON(incomingData)/> 

<cfset a = "0"> 
<cfset b = ""> 
<cfset c = "0"> 
<cfset d = "0"> 
<cfset e = ""> 
<cfset f = ""> 
<cfset g = ""> 
<cfset h = ""> 
<cfset i = ""> 
<cfset k = "#NOW()#"> 
<cfset l = ""> 
<cfset m = ""> 
<cfset n = ""> 

<cfoutput> 
<cfloop from="1" to="#arraylen(djs)#" index="i"> 

    <cfset a = "0"> 
    <cfset b = ""> 
    <cfset c = "0"> 
    <cfset d = "0"> 
    <cfset e = ""> 
    <cfset f = ""> 
    <cfset g = ""> 
    <cfset h = ""> 
    <cfset i = ""> 
    <cfset k = "#NOW()#"> 
    <cfset l = ""> 
    <cfset m = ""> 
    <cfset n = ""> 

    <cfif StructKeyExists(djs[i],'p')> 
     <cfset a  = djs[i].p /> 
    </cfif> 

    <cfif StructKeyExists(djs[i],'q')> 
     <cfset b   = djs[i].q /> 
    </cfif> 
    <cfif StructKeyExists(djs[i],'r')> 
     <cfset c  = djs[i].r /> 
    </cfif> 
    <cfif StructKeyExists(djs[i],'s')> 
     <cfset d  = djs[i].s /> 
    </cfif>  
    <cfif StructKeyExists(djs[i],'t')> 
     <cfset e  = djs[i].t /> 
    </cfif> 
    <cfif StructKeyExists(djs[i],'u')> 
     <cfset f   = djs[i].u /> 
    </cfif> 
    <cfif StructKeyExists(djs[i],'v')> 
     <cfset g  = djs[i].v /> 
    </cfif> 

    <cfif StructKeyExists(djs[i],'w')> 
     {                   
     <cfset i = djs[i].w /> 
     <cfset k = dateAdd("s", i, createDateTime(1970, 1, 1, 0, 0, 0))/> 
     } 
    </cfif> 
    <cfif StructKeyExists(djs[i],'x')> 
     <cfset l   = djs[i].x /> 
    </cfif> 
    <cfif StructKeyExists(djs[i],'y')> 
     <cfset m  = djs[i].y /> 
    </cfif> 
    <cfif StructKeyExists(djs[i],'z')> 
     <cfset n  = djs[i].z /> 
    </cfif> 

    <cfstoredproc procedure="sp1" datasource="db1"> 
     <cfprocparam cfsqltype="cf_sql_bigint" value="#a#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#left(b,199)#"> 
     <cfprocparam cfsqltype="cf_sql_integer" value="#c#"> 
     <cfprocparam cfsqltype="cf_sql_integer" value="#d#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#left(e,199)#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#left(f,199)#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#left(g,499)#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#left(h,199)#"> 
     <cfprocparam cfsqltype="cf_sql_timestamp" value="#k#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#left(l,199)#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#LEFT(m,499)#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#left(n,99)#"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="XX.XX.X.XX"> 
    </cfstoredproc> 
</cfloop> 

</cfoutput> 

</cftry> 

貼在研究中的數據,我發現人們談論一些UTF8格式 代碼。但是,如果這是實際問題,那麼爲什麼只有少數情況而不是每次都會出現上述 錯誤?請指教。

+0

這聽起來像它關係到Unicode。該列的字符集和校對是什麼?至於錯誤是零星的,我想它將取決於你正在插入什麼字符(可能會改變)。嚴格執行[錯誤消息描述](https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_truncated_wrong_value_for_field)聽起來像輸入包含無效字符或*輸入字符串的解釋*被截斷。再次,這聽起來像某種字符集問題。 – Leigh 2014-11-06 20:48:51

+0

@Leigh'l_vc'列的排序規則是'latin_swedish_ci'。如何找到特定列的字符集? – John 2014-11-06 21:03:04

+0

**編輯**:查看[INFORMATION_SCHEMA.COLUMNS](https://dev.mysql.com/doc/refman/5.0/en/columns-table.html)視圖。另外,a)您的DSN設置是什麼?他們具體是否支持unicode?和b)什麼是不符合上述錯誤的字符串示例? – Leigh 2014-11-06 21:12:29

回答

2

更新:從MySQL 5.5.3開始,還有UTF8mb4 which is often recommended over UTF8


這聽起來像它關係到Unicode。該列的字符集和校對是什麼?查看INFORMATION_SCHEMA.COLUMNS視圖。至於錯誤是零星的,我想它將取決於你正在插入什麼字符(這可能會改變)。嚴格執行error message description,即er_truncated_wrong_value_for_field,它聽起來像是輸入包含無效字符,或者輸入字符串的解釋正在被截斷。再次,這聽起來像某種字符集問題。

更新:

假設您收到一個有效的UTF8字符串,它似乎是一個字符集問題。雖然我的測試數據庫默認使用字符集UTF8,但我可以通過創建一個使用兩種不同字符集的小表來重現該錯誤:LATIN1和UTF8。然後在兩列中插入一個小的UTF8 string。插入到UTF8列工作正常,但LATIN1列失敗,錯誤爲:

Incorrect string value: '/xD0/x9D/xD0/xB0 /xD0...' for column 'ColDefaultCharset' at row 1 ...

嘗試改變字符集爲UTF8,我認爲INSERT將正常工作:

ALTER TABLE YourTable MODIFY YourColumnName VARCHAR(500) CHARACTER SET utf8; 

表:

CREATE TABLE TestTable (
    ID INTEGER NOT NULL AUTO_INCREMENT 
    , ColDefaultCharset VARCHAR(100) CHARSET LATIN1 NULL 
    , ColUTF8Charset VARCHAR(100) CHARSET UTF8 NULL 
    , PRIMARY KEY (ID) 
) ENGINE=InnoDB DEFAULT CHARSET=LATIN1; 

示例文本:

На берегу пустынных волн 
Стоял он, дум великих полн, 

程序:

CREATE PROCEDURE `testWithUTF8` 
(
    IN `sl` VARCHAR(500) 
) 
BEGIN 
    INSERT INTO testTable (ColUTF8Charset) 
    VALUES (sl); 

END 


CREATE PROCEDURE `testWithLatin1` 
(
    IN `sl` VARCHAR(500) 
) 
BEGIN 
    INSERT INTO testTable (ColDefaultCharset) 
    VALUES (sl); 

END 

代碼:

<cfprocessingdirective pageEncoding="UTF8"> 
<cfsavecontent variable="text"> 
На берегу пустынных волн 
Стоял он, дум великих полн, 
</cfsavecontent> 

<!--- Note: For CF10, use cf_sql_nvarchar ---> 
<cfstoredproc procedure="testWithUTF8" datasource="MySQL" result="procResult"> 
    <cfprocparam cfsqltype="cf_sql_varchar" value="#text#"> 
</cfstoredproc> 
<cfdump var="#procResult#"> 

<cfstoredproc procedure="testWithLatin1" datasource="MySQL" result="procResult"> 
    <cfprocparam cfsqltype="cf_sql_varchar" value="#text#"> 
</cfstoredproc> 
<cfdump var="#procResult#"> 

DSN設置:

  • 司機:MySQL的5
  • 高級設置>連接字符串:characterEncoding=UTF8
相關問題